Data preparation script for Sierra Nevada time series analysis

package ‘openxlsx’ was built under R version 3.6.2

Merge templates with 14C, C, and N data

Radiocarbon analyses for the 2001 samples were not run originally, but were completed on archived samples in 2020.

Fig. 16. Litter incubation \(\Delta\)14C-CO2 (2019)

Caption: Mean \(\Delta\)14C-CO2 for each site. Error bars show min and max of duplicate incubation samples. a) Data shown by site, without litter depth, b) Data shown by depth of litter layer, binned by climate zone.

2001 mean radiocarbon profiles

Fig. 16. Mean profile \(\Delta\)14C for 2001 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

2009 radiocarbon profiles

Fig. 16. Profile \(\Delta\)14C for 2009 samples

Caption: Profile \(\Delta\)14C by depth for each site in 2009. Solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling. Error bars not shown as only a single replicate profile was analyzed per site.

2019 mean radiocarbon profiles

Fig. 16. Mean profile \(\Delta\)14C for 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2019. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

Change in \(\Delta\)14C over time between 2001 and 2019

Fig. 16. Mean profile \(\Delta\)14C for 2001 and 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001 and 2019. Error bars show ±1 standard deviation. Vertical lines show \(\Delta\)14C of the atmosphere in 2001 (solid) and 2019 (dashed).

Incubation \(\Delta\)14C-CO2

Fig. 16. \(\Delta\)14C-CO2 of 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2019. One rep from GRrf 10-20 (the 10-20 cm increment sample from the cold granite site) is strongly depleted relative to the other rep: \(\Delta\)14C-CO2 = -396.7, -23.5. The highly depleted sample has been excluded for display reasons.

Fig. 16. \(\Delta\)14C-CO2 of 2001 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001. Note that some sites only have two depth increments. Similar to the 2019 dataset, one of the GRrf reps from the deepest depth increment was strongly depleted: \(\Delta\)14C-CO2 = -469.1. Both points have been excluded for display reasons.

Fig. 16. \(\Delta\)14C-CO2 of 2001 and 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2001 and 2019. Different depth increments were sampled in 2001 and 2019. Points are the mean of laboratory duplicates; error bars are the measured values of each duplicate. Granite/cold point exlcuded for display reasons as it is strongly depleted.

Incubation vs. bulk soil \(\Delta\)14C

Fig. 16. Respiration data from incubations of 2019 and 2001 bulk soils.

Caption: Points show measured CO2 production of laboratory duplicates as cumulative fluxes or daily flux rates by depth, lines show the means, and the ribbon represents the range.

Fig. 16. \(\Delta\)14C of 2019 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Fig. 16. \(\Delta\)14C of 2001 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2001. Points show mean of three replicate profiles for bulk soils and mean of laboratory duplicates for respired CO2. The incubated soil samples are a composite made by homogenizing subsamples from each of the three replicate profile samples by depth. Error bars show one standard deviation for bulk soil and the measured values from laboratory duplicates of the incubated composite samples.

$emtrends
 PM d14c_mean.bulk.trend    SE df lower.CL upper.CL
 AN                0.514 0.144 42    0.224    0.804
 BS                0.873 0.169 42    0.532    1.214
 GR                0.952 0.136 42    0.679    1.226

Confidence level used: 0.95 

$contrasts
 contrast estimate    SE df t.ratio p.value
 AN - BS   -0.3593 0.222 42 -1.621  0.2481 
 AN - GR   -0.4387 0.198 42 -2.221  0.0792 
 BS - GR   -0.0794 0.216 42 -0.367  0.9287 

P value adjustment: tukey method for comparing a family of 3 estimates 

$emtrends
 eco d14c_mean.bulk.trend    SE df lower.CL upper.CL
 pp                 0.779 0.145 42    0.487    1.071
 rf                 0.777 0.317 42    0.137    1.417
 wf                 0.606 0.147 42    0.308    0.903

Confidence level used: 0.95 

$contrasts
 contrast estimate    SE df t.ratio p.value
 pp - rf   0.00222 0.349 42 0.006   1.0000 
 pp - wf   0.17373 0.206 42 0.841   0.6797 
 rf - wf   0.17150 0.350 42 0.491   0.8762 

P value adjustment: tukey method for comparing a family of 3 estimates 

Fig. 16. Regression of 2019 bulk soil incubations and corresponding bulk soil \(\Delta\)14C

Caption: Regressions of \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2.

Time series: \(\Delta\)14C by depth (as measured)

Fig. 16. Time series of \(\Delta\)14C by depth, as measured

Caption: Points show mean of three profile replicates for 2001, 2009, and 2019 samples. Error bars show ± 1 standard deviation of the mean (only a single profile was analyzed in 2009). Stars show litter incubation \(\Delta\)14C-CO2 for 2019 samples as a point of reference.

Spline fitting

Soils collected in both the 2001 and 2009 sampling campaigns were sampled by horizon, but the depth intervals differed between the two sampling years. In 2009, full profiles were excavated for each site, as opposed to the shorter profiles collected in 2001 from the GR and AN sites. Radiocarbon was measured on all three replicate profiles at each site for the 2001 samples, but only for one of the replicate profiles at each site in 2009, e.g. ANpp rep2, etc.

In order to compare the radiocarbon profiles between 2001, 2009, and 2019 we first interpolated both radiocarbon and carbon stock data at 1 cm intervals for each site in the datasets from each year. The carbon-stock-weighted radiocarbon values for any given target depth interval can then be calculated as a simple sum of the product of the carbon weight of each 1 cm increment (relative to the total carbon stock of the target depth interval) and its radiocarbon value. A monotonic cubic spline fit with Hyman filtering was used for the carbon stock interpolation (Wendt and Hauser 2013), and a mass-preserving spline was used to fit the radiocarbon data (Bishop, T.F.A., McBratney, A.B., Laslett, G.M., (1999) Modelling soil attribute depth functions with equal-area quadratic smoothing splines. Geoderma, 91(1-2): 27-45).

Fig. 16. Time series of bulk soil \(\Delta\)14C by 2001 depths (2001, 2009, 2019 samples)

Caption: Points for 2001 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2009 and 2019 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2001. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009).

Fig. 16. Time series of bulk soil \(\Delta\)14C by depth (splined to 2019 depths)

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009). NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

$`10`

$`20`

$`30`

Fig. 16. Change in \(\Delta\)14C of bulk soil (panel a) and respired CO2 (panel b) over time relative to the atmosphere

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 (bulk only) samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars for bulk samples in panel (a) show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009); error bars for incubation samples in panel (b) show the values of the two reps, while the point represents the mean. NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%
Fitting mass preserving splines per profile...

  |                                                                                              
  |                                                                                        |   0%
  |                                                                                              
  |========================================================================================| 100%

$`10`
0-10 cm
2001 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
3.776 -57.040 64.592 0.987 BS-AN
43.034 -17.782 103.850 0.201 GR-AN
39.258 -19.742 98.258 0.239 GR-BS

$`20`
10-20 cm
2001 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
47.757 4.712 90.803 0.028 BS-AN
45.292 2.247 88.338 0.038 GR-AN
-2.465 -44.225 39.295 0.988 GR-BS

$`30`
20-30 cm
2001 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
55.395 17.734 93.055 0.003 BS-AN
66.204 28.544 103.865 0.001 GR-AN
10.810 -25.726 47.346 0.742 GR-BS

$`10`
0-10 cm
2001 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-71.522 -121.112 -21.931 0.004 rf-pp
-69.488 -117.597 -21.379 0.004 wf-pp
2.033 -47.557 51.623 0.994 wf-rf

$`20`
10-20 cm
2001 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-30.492 -77.815 16.831 0.260 rf-pp
-33.125 -79.035 12.785 0.190 wf-pp
-2.633 -49.956 44.690 0.989 wf-rf

$`30`
20-30 cm
2001 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-19.910 -71.507 31.686 0.605 rf-pp
-9.482 -59.538 40.574 0.884 wf-pp
10.429 -41.168 62.025 0.869 wf-rf

$`10`
0-10 cm
2001 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-8.178 -63.772 47.417 0.923 BS-AN
-3.095 -58.689 52.500 0.989 GR-AN
5.083 -50.512 60.678 0.969 GR-BS

$`20`
10-20 cm
2001 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
23.755 -39.544 87.055 0.600 BS-AN
-44.282 -110.671 22.108 0.224 GR-AN
-68.037 -134.426 -1.648 0.044 GR-BS

$`30`
20-30 cm
2001 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
41.442 -56.220 139.105 0.523 BS-AN
-61.708 -164.138 40.721 0.288 GR-AN
-103.151 -205.580 -0.721 0.048 GR-BS

$`10`
0-10 cm
2001 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-54.988 -96.644 -13.332 0.010 rf-pp
-34.104 -75.760 7.552 0.118 wf-pp
20.883 -20.773 62.539 0.416 wf-rf

$`20`
10-20 cm
2001 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-21.298 -100.627 58.032 0.766 rf-pp
6.974 -68.664 82.612 0.968 wf-pp
28.272 -51.058 107.601 0.629 wf-rf

$`30`
20-30 cm
2001 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
8.875 -106.631 124.380 0.978 rf-pp
61.977 -48.153 172.107 0.333 wf-pp
53.103 -62.403 168.608 0.471 wf-rf

$`10`
0-10 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-41.756 -76.898 -6.613 0.018 AN-GR
-9.522 -44.665 25.621 0.779 BS-GR
32.233 -2.909 67.376 0.077 BS-AN

$`20`
10-20 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-54.667 -106.932 -2.401 0.039 AN-GR
-16.478 -68.743 35.788 0.714 BS-GR
38.189 -14.077 90.455 0.183 BS-AN

$`30`
20-30 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-35.544 -84.884 13.796 0.191 AN-GR
-25.789 -75.129 23.551 0.406 BS-GR
9.756 -39.584 59.096 0.875 BS-AN

$`40`
30-40 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-31.478 -89.509 26.553 0.380 AN-GR
-19.733 -77.765 38.298 0.677 BS-GR
11.744 -46.287 69.776 0.869 BS-AN

$`50`
40-50 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-46.722 -107.064 13.620 0.151 AN-GR
-27.589 -87.931 32.753 0.498 BS-GR
19.133 -41.209 79.475 0.712 BS-AN

$`60`
50-60 cm
2019 bulk PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-9.289 -72.136 53.558 0.928 AN-GR
-7.044 -69.891 55.802 0.958 BS-GR
2.244 -60.602 65.091 0.996 BS-AN

$`70`
NULL

$`80`
NULL

$`90`
NULL

$`10`
0-10 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-31.500 -65.613 2.613 0.074 wf-rf
14.222 -19.890 48.335 0.559 pp-rf
45.722 11.610 79.835 0.007 pp-wf

$`20`
10-20 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-35.556 -82.679 11.568 0.165 wf-rf
35.944 -11.179 83.068 0.159 pp-rf
71.500 24.376 118.624 0.002 pp-wf

$`30`
20-30 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-58.167 -94.986 -21.348 0.002 wf-rf
10.767 -26.052 47.586 0.748 pp-rf
68.933 32.114 105.752 0.000 pp-wf

$`40`
30-40 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-67.222 -107.865 -26.579 0.001 wf-rf
14.578 -26.065 55.221 0.648 pp-rf
81.800 41.157 122.443 0.000 pp-wf

$`50`
40-50 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-59.322 -105.522 -13.122 0.010 wf-rf
28.344 -17.855 74.544 0.294 pp-rf
87.667 41.467 133.866 0.000 pp-wf

$`60`
50-60 cm
2019 bulk ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-59.622 -114.836 -4.409 0.033 wf-rf
-27.478 -82.691 27.736 0.440 pp-rf
32.144 -23.069 87.358 0.330 pp-wf

$`70`
NULL

$`80`
NULL

$`90`
NULL

$`10`
0-10 cm
2019 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-3.917 -40.999 33.165 0.959 BS-AN
7.583 -29.499 44.665 0.857 GR-AN
11.500 -25.582 48.582 0.705 GR-BS

$`20`
10-20 cm
2019 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-16.133 -76.600 44.333 0.768 BS-AN
-24.507 -87.925 38.911 0.582 GR-AN
-8.373 -71.791 55.045 0.937 GR-BS

$`30`
20-30 cm
2019 inc PM
PM.diff PM.lwr PM.upr PM.p.adj Pairs
-36.657 -86.659 13.346 0.170 BS-AN
-21.283 -68.959 26.392 0.490 GR-AN
15.373 -34.629 65.376 0.706 GR-BS

$`10`
0-10 cm
2019 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-19.217 -54.416 15.983 0.357 rf-pp
-2.367 -37.566 32.833 0.983 wf-pp
16.850 -18.350 52.050 0.447 wf-rf

$`20`
10-20 cm
2019 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-32.333 -87.289 22.623 0.303 rf-pp
-48.617 -101.015 3.782 0.071 wf-pp
-16.283 -71.239 38.673 0.724 wf-rf

$`30`
20-30 cm
2019 inc ECO
ECO.diff ECO.lwr ECO.upr ECO.p.adj Pairs
-14.457 -68.364 39.450 0.766 rf-pp
-21.933 -73.332 29.465 0.520 wf-pp
-7.477 -61.384 46.430 0.930 wf-rf

$ANpp
$ANpp$`10`
0-10 cm
ANpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-108.646 -161.123 -56.17 0.005 2019-2001

$ANpp$`20`
10-20 cm
ANpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-39.132 -121.572 43.307 0.258 2019-2001

$ANpp$`30`
20-30 cm
ANpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
19.62 -60.937 100.178 0.536 2019-2001


$ANrf
$ANrf$`10`
0-10 cm
ANrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-39.662 -97.2 17.876 0.116 2019-2001

$ANrf$`20`
10-20 cm
ANrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-23.451 -62.372 15.471 0.151 2019-2001

$ANrf$`30`
20-30 cm
ANrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
3.602 -44.344 51.548 0.826 2019-2001


$ANwf
$ANwf$`10`
0-10 cm
ANwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
2.096 -54.912 59.104 0.924 2019-2001

$ANwf$`20`
10-20 cm
ANwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
7.388 -22.778 37.553 0.534 2019-2001

$ANwf$`30`
20-30 cm
ANwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
5.913 -13.918 25.744 0.454 2019-2001


$BSpp
$BSpp$`10`
0-10 cm
BSpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-34.257 -85.03 16.516 0.134 2019-2001

$BSpp$`20`
10-20 cm
BSpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-4.4 -43.862 35.063 0.772 2019-2001

$BSpp$`30`
20-30 cm
BSpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-16.345 -82.688 49.998 0.532 2019-2001


$BSrf
$BSrf$`10`
0-10 cm
BSrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
14.282 -37.804 66.367 0.489 2019-2001

$BSrf$`20`
10-20 cm
BSrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-8.656 -67.505 50.193 0.704 2019-2001

$BSrf$`30`
20-30 cm
BSrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
27.438 -46.279 101.155 0.36 2019-2001


$BSwf
$BSwf$`10`
0-10 cm
BSwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-36.239 -83.527 11.049 0.1 2019-2001

$BSwf$`20`
10-20 cm
BSwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-64.075 -115.738 -12.412 0.026 2019-2001

$BSwf$`30`
20-30 cm
BSwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-113.138 -153.195 -73.08 0.001 2019-2001


$GRpp
$GRpp$`10`
0-10 cm
GRpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-51.541 -120.524 17.443 0.107 2019-2001

$GRpp$`20`
10-20 cm
GRpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
36.232 -32.197 104.661 0.215 2019-2001

$GRpp$`30`
20-30 cm
GRpp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
2.096 -49.559 53.75 0.916 2019-2001


$GRrf
$GRrf$`10`
0-10 cm
GRrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-4.878 -56.92 47.164 0.808 2019-2001

$GRrf$`20`
10-20 cm
GRrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
9.203 -13.93 32.335 0.331 2019-2001

$GRrf$`30`
20-30 cm
GRrf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
6.556 -18.916 32.027 0.514 2019-2001


$GRwf
$GRwf$`10`
0-10 cm
GRwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-89.004 -114.543 -63.464 0.001 2019-2001

$GRwf$`20`
10-20 cm
GRwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-65.737 -141.304 9.829 0.073 2019-2001

$GRwf$`30`
20-30 cm
GRwf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-65.759 -140.676 9.159 0.071 2019-2001


$AN
$AN$`10`
0-10 cm
AN 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-47.196 -96.931 2.54 0.061 2019-2001

$AN$`20`
10-20 cm
AN 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-16.142 -50.009 17.725 0.326 2019-2001

$AN$`30`
20-30 cm
AN 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
11.624 -21.346 44.594 0.464 2019-2001


$BS
$BS$`10`
0-10 cm
BS 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-18.738 -51.619 14.142 0.245 2019-2001

$BS$`20`
10-20 cm
BS 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-25.71 -57.388 5.967 0.105 2019-2001

$BS$`30`
20-30 cm
BS 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-34.015 -76.337 8.307 0.108 2019-2001


$GR
$GR$`10`
0-10 cm
GR 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-48.474 -89.466 -7.482 0.023 2019-2001

$GR$`20`
10-20 cm
GR 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-6.768 -59.155 45.62 0.788 2019-2001

$GR$`30`
20-30 cm
GR 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-19.036 -54.623 16.551 0.274 2019-2001


$pp
$pp$`10`
0-10 cm
pp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-64.815 -100.543 -29.086 0.001 2019-2001

$pp$`20`
10-20 cm
pp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-2.433 -50.649 45.783 0.916 2019-2001

$pp$`30`
20-30 cm
pp 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
1.79 -36.185 39.766 0.922 2019-2001


$rf
$rf$`10`
0-10 cm
rf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-7.515 -30.699 15.668 0.5 2019-2001

$rf$`20`
10-20 cm
rf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-7.886 -35.016 19.245 0.545 2019-2001

$rf$`30`
20-30 cm
rf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
10.934 -15.022 36.89 0.383 2019-2001


$wf
$wf$`10`
0-10 cm
wf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-41.049 -84.594 2.497 0.063 2019-2001

$wf$`20`
10-20 cm
wf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-40.808 -80.859 -0.757 0.046 2019-2001

$wf$`30`
20-30 cm
wf 2001 vs. 2019 bulk year
year.diff year.lwr year.upr year.p.adj Pairs
-57.661 -102.561 -12.761 0.015 2019-2001
NaNs producedNaNs producedNaNs produced
$ANpp
$ANpp$`10`
0-10 cm
ANpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-112.068 -168.378 -55.758 0.013 2019-2001

$ANpp$`20`
10-20 cm
ANpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-41.107 -126.069 43.856 0.173 2019-2001

$ANpp$`30`
20-30 cm
ANpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
26.321 -162.239 214.88 0.609 2019-2001


$ANrf
$ANrf$`10`
0-10 cm
ANrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-53.528 -70.509 -36.547 0.005 2019-2001

$ANrf$`20`
10-20 cm
ANrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-20.65 -71.163 29.863 0.221 2019-2001

$ANrf$`30`
20-30 cm
ANrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
20.616 -7.758 48.989 0.089 2019-2001


$ANwf
$ANwf$`10`
0-10 cm
ANwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-25.061 -123.937 73.815 0.39 2019-2001

$ANwf$`20`
10-20 cm
ANwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-18.73 -25.823 -11.636 0.007 2019-2001

$ANwf$`30`
20-30 cm
ANwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-26.671 -63.212 9.87 0.088 2019-2001


$BSpp
$BSpp$`10`
0-10 cm
BSpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-41.7 -75.535 -7.865 0.034 2019-2001

$BSpp$`20`
10-20 cm
BSpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-20.628 -38.25 -3.006 0.037 2019-2001

$BSpp$`30`
20-30 cm
BSpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
9.436 -108.88 127.751 0.764 2019-2001


$BSrf
$BSrf$`10`
0-10 cm
BSrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-69.149 -82.933 -55.365 0.002 2019-2001

$BSrf$`20`
10-20 cm
BSrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-72.152 -162.05 17.746 0.075 2019-2001

$BSrf$`30`
20-30 cm
BSrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-61.935 -70.107 -53.763 0 2019-2001


$BSwf
$BSwf$`10`
0-10 cm
BSwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-67.026 -82.623 -51.43 0.002 2019-2001

$BSwf$`20`
10-20 cm
BSwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-107.373 -168.048 -46.697 0.017 2019-2001

$BSwf$`30`
20-30 cm
BSwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-139.763 -241.947 -37.579 0.028 2019-2001


$GRpp
$GRpp$`10`
0-10 cm
GRpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-89.459 -114.521 -64.397 0.004 2019-2001

$GRpp$`20`
10-20 cm
GRpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
25.06 -77.741 127.86 0.405 2019-2001

$GRpp$`30`
20-30 cm
GRpp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
49.63 -228.753 328.013 0.524 2019-2001


$GRrf
$GRrf$`10`
0-10 cm
GRrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-13.237 -147.681 121.206 0.713 2019-2001

$GRrf$`20`
10-20 cm
GRrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
69.3 NaN NaN NaN 2019-2001

$GRrf$`30`
20-30 cm
GRrf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
166.594 NaN NaN NaN 2019-2001


$GRwf
$GRwf$`10`
0-10 cm
GRwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-55.927 -101.954 -9.899 0.035 2019-2001

$GRwf$`20`
10-20 cm
GRwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-77.344 -162.104 7.416 0.059 2019-2001

$GRwf$`30`
20-30 cm
GRwf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
0.089 -36.296 36.474 0.993 2019-2001


$AN
$AN$`10`
0-10 cm
AN 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-63.553 -94.114 -32.991 0.001 2019-2001

$AN$`20`
10-20 cm
AN 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-26.829 -48.81 -4.847 0.022 2019-2001

$AN$`30`
20-30 cm
AN 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
6.755 -37.035 50.545 0.738 2019-2001


$BS
$BS$`10`
0-10 cm
BS 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-59.292 -79.352 -39.232 0 2019-2001

$BS$`20`
10-20 cm
BS 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-66.718 -102.636 -30.799 0.002 2019-2001

$BS$`30`
20-30 cm
BS 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-64.087 -123.626 -4.549 0.037 2019-2001


$GR
$GR$`10`
0-10 cm
GR 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-52.874 -112.814 7.065 0.078 2019-2001

$GR$`20`
10-20 cm
GR 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-7.054 -105.253 91.146 0.873 2019-2001

$GR$`30`
20-30 cm
GR 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
47.18 -45.261 139.621 0.278 2019-2001


$pp
$pp$`10`
0-10 cm
pp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-81.076 -110.49 -51.662 0 2019-2001

$pp$`20`
10-20 cm
pp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-12.225 -41.041 16.591 0.367 2019-2001

$pp$`30`
20-30 cm
pp 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
28.462 -20.711 77.636 0.226 2019-2001


$rf
$rf$`10`
0-10 cm
rf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-45.305 -84.505 -6.104 0.028 2019-2001

$rf$`20`
10-20 cm
rf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-23.261 -119.616 73.094 0.593 2019-2001

$rf$`30`
20-30 cm
rf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
9.738 -101.496 120.971 0.847 2019-2001


$wf
$wf$`10`
0-10 cm
wf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-49.338 -79.02 -19.657 0.004 2019-2001

$wf$`20`
10-20 cm
wf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-67.816 -112.331 -23.3 0.007 2019-2001

$wf$`30`
20-30 cm
wf 2001 vs. 2019 inc year
year.diff year.lwr year.upr year.p.adj Pairs
-55.448 -108.861 -2.035 0.043 2019-2001
NANA

Call:
lm(formula = d14c_blk ~ Al_ox + lyr_bot + year, data = sra.01.19.min.reps)

Residuals:
    Min      1Q  Median      3Q     Max 
-89.532 -27.114  -0.197  26.055 115.938 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 108.5757     6.0801  17.858  < 2e-16 ***
Al_ox        -1.9945     0.1687 -11.822  < 2e-16 ***
lyr_bot      -3.0592     0.2487 -12.300  < 2e-16 ***
year2019    -22.4127     4.0521  -5.531 6.71e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 36.11 on 314 degrees of freedom
Multiple R-squared:  0.527, Adjusted R-squared:  0.5225 
F-statistic: 116.6 on 3 and 314 DF,  p-value: < 2.2e-16

Initial modeling

The goal of this modeling exercise is to see how parent material and climate/ecosystem affect estimates of soil carbon ages and transit times. Bulk soil 14C observations from 2001, 2009, and 2019 will be used to constrain the carbon models, as well as observations of 14C-CO2 from laboratory soil incubations of soils collected in 2001 and 2019. Previous work has indicated that the carbon stocks at these sites is likely at equilibrium, so we will apply the steady-state assumption to the modeling.

Two-pool models

One pool models have been shown repeatedly to be inadequate for describing soil carbon dynamics. However, as simple models are easier to constrain, we will start with a two-pool parallel and two-series models, as these are the simplest model system beyond the single pool approach.

The two-pool parallel model requires the following parameters: * decomposition constants for each pool (k1, k2) * input partitioning coefficient (\(\gamma\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C 1 The two-pool series model requires the following parameters: * decomposition constants for each pool (k1, k2) * transfer coefficient (\(\alpha\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

Decomposition rates (k) are related to the amount of 14C in a pre-bomb system (fraction modern, F) at steady-state by the following equations (cf. Schuur, Druffle, and Trumbore, 2016): >Eq. 1

\[F = \frac{k}{k + \lambda}\] >Eq. 2

\[k = \frac{\lambda \cdot F}{1 - F}\] >where \(\lambda\) is the radioactive decay constant (1/8267).

As the decomposition rates will vary, the initial 14C content can be determined dynamically with equation 1.

Carbon stocks are known, while inputs will be estimated and are related to the steady-state conditions by the following equation: >Eq. 3

\[I = (k_{1} \cdot C_{1}) + (k_{2} \cdot C_{2})\] >where C1 and C2 are the carbon stocks of the two model pools.

Both stocks and inputs can be scaled to the known value of the total carbon pool once the steady-state parameters (k1, k2, and \(\gamma\) or \(\alpha\)) have been determined. Pool sizes are a function of the inputs and input partitioning coefficient at steady-state.

A Monte-Carlo Markov chain approach will be used for parameter estimation in combination with an initial optimization algorithm to determine the best set of initial parameters.

Workflow

Initial model fitting was performed for both model structures using generous parameter ranges [0, 1] for all three parameters (k1, k2, \(\gamma\) or \(\alpha\)). The initial parameter set was found by fitting the models by eye, followed by optimization with the function “modFit” (R package FME), using the Nelder-Mead algorithm. The best set of parameters found by modFit was then used as the input to a Monte Carlo Markov Chain (MCMC), using the function “modMCMC” (R package FME). The number of iterations for the MCMC optimization was set at 5000 intially, with delayed rejection employed to increase efficiency.

The sum of the mean squared error for the best parameter set was slightly lower for the parallel structure than for the series structure. Additionally, the overall mean error of the residuals was also lower for the parallel structure, moderately so for the bulk C observations but substantially so for the respiration observations (in andesite and granite soils in particular).

However, these initial fits yielded unrealistic parameter estimates for multiple sites, particularly at the lower depths. Additionally, the modFit output showed very high correlation between the parameters for both model structures (slightly higher for the two-pool series model).

Parameter optimization

Optimizing the parameter set requires imposing costs and optionally constraining the allowable range of values for each parameter. Given that we only have data for three time points, this is a relatively sparse data set for constraining these models. Accordingly, the optimization procedure will benefit from a priori constraints of the allowable parameter ranges. For example, since we assume that the system cannot be adequately modeled as a single homogenous reservoir, we will ensure that the optimization procedure cannot collapse the two-pool system into a single pool. This can be mitigated in the two-pool parallel optimization by constraining \(\gamma\) (i.e. the percentage of the inputs entering the fast pool) to a range of 50% to 95%. Similarly, for the two-pool series model structure we can constrain the range of the transfer coefficient to be between 0.0 and 0.1, ensuring that some carbon remains in the fast cycling pool.

Additionally, to enforce a relatively fast cycling pool and relatively slower cycling pool, we will loosely constrain the intrinsic decomposition rates as well (both model structures):

k1: [0.02, 1.00] (50 to 1 year) k2: [0.0001, 0.02] (10,000 to 50 years)

Finally, the models will be run to enforce steady-state, i.e. with unvarying carbon stocks. The amount of carbon observed in the system will be used in the cost function in addition to the radiocarbon observations made in 2001, 2009, and 2019. The inputs will be estimated from net ecosystem exchange (NEE) data measured at nearby eddy covariance sites: Blodgett experimental forest (AmeriFlux), Lower Teakettle (NEON), and Soaproot Saddle (NEON). Alternatively, using correlations between fluxes measured from these eddy covariance towers and GPP estimated from satellite retrievals of SIF, estimates can be made for inputs at the pixels corresponding to each site location.

Error in lapply(mod.fits.2pp3, "[[", 1) : 
  object 'mod.fits.2pp3' not found

Bayesian parameter estimation (MCMC)

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBUaW1lIFNlcmllcyIKYXV0aG9yOiAiSi4gQmVlbS1NaWxsZXIiCmRhdGU6ICIyMSBPY3QgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBjc3M6IGN1c3RvbS5jc3MKaGVhZGVyX2luY2x1ZGVzOgogIC0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CiAgLSBcdXNlcGFja2FnZXtmbG9hdH0KLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9ICdjYWlyb19wZGYnKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKIyBzdXBwcmVzcyBncm91cGluZyBpbmZvcm1hdGlvbiBtZXNzYWdlCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQpsaWJyYXJ5KElTUmFEKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KEZNRSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ3QpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkoZW1tZWFucykKYGBgCgojIERhdGEgcHJlcGFyYXRpb24gc2NyaXB0IGZvciBTaWVycmEgTmV2YWRhIHRpbWUgc2VyaWVzIGFuYWx5c2lzCgpgYGB7ciBsb2FkIGFtcy1qZW5hLWluZ2VzdCBmeH0KIyAxLiBSZWFkIGluIGlzb3RvcGUgZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcwojIEZpcnN0IGxvYWQgaGVscGVyIGZ1bmN0aW9ucyAncmVhZF9qZW5hX2Ftc19yZXN1bHRzLlInLCAncmVhZF9qZW5hX2lzb19yZXN1bHRzLlInIApzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2lzb19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHBsb3QtZnVuc30KIyBjb2xvciBwYWxldHRlcyBmb3IgRUNPICYgUE0Kd2FybSA8LSAiI0JGODEyRCIKY29vbCA8LSAiIzgwQ0RDMSIKY29sZCA8LSAiIzAxNjY1RSIKZ3Jhbml0ZSA8LSAiIzlkYWJhOSIKYW5kZXNpdGUgPC0gIiMzODJkYmYiCmJhc2FsdCA8LSAiI2JmMzgyZCIKYGBgCgpgYGB7ciByZWFkLWNuLWlzby1kYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgIyAxM0MKIyAjIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJpc29famVuYSIgaW4gbmFtZQojIGlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQojIGlzb19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoaXNvX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewojICAgcmVhZF9qZW5hX2lzb19yZXN1bHRzKGlzb19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKIyB9KQojIG5hbWVzKGlzb19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIpCgojIFJlYWQgaW4gQyBhbmQgTiBkYXRhCmVsbV9yZXN1bHRzX2RpciA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQplbG1fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGVsbV9yZXN1bHRzX2RpciksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfZWxtX3Jlc3VsdHMoZWxtX3Jlc3VsdHNfZGlyW2ldKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGRhdGEtdGVtcGxhdGV9CiMgQ3JlYXRlIHRlbXBsYXRlIGZvciBidWxrIHNvaWwgZGF0YQp0ZW1wbGF0ZTE5LmZ4IDwtIGZ1bmN0aW9uKHBtLCBlY28sIG5kZXB0aCkgewogIGRmIDwtIGRhdGEuZnJhbWUoWWVhciA9IHJlcCgyMDE5LCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIFBNID0gcmVwKHBtLCBuZGVwdGggKiAzKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgcHJvX3JlcCA9IHJlcChzZXEoMSwzKSwgZWFjaCA9IG5kZXB0aCksCiAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gcmVwKHNlcSgwLCAobmRlcHRoLTEpICogMTAsIGJ5ID0gMTApLCAzKSwKICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSByZXAoc2VxKDEwLCAobmRlcHRoKSAqIDEwLCBieSA9IDEwKSwgMykpCiAgZGYkcHJvX25hbWUgPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08sICJfIiwgZGYkcHJvX3JlcCkKICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogIHJldHVybihkZikKfQoKIyBDcmVhdGUgdGVtcGxhdGUgZm9yIGNvbXBvc2l0ZSBzb2lsIGRhdGEgKGluY3ViYXRpb25zLCBkZW5zaXR5IGZyYWN0aW9ucywgZXRjLikKdGVtcGxhdGUuY29tcC5meCA8LSBmdW5jdGlvbih5ZWFyLCBwbSwgZWNvLCBkZXB0aF9ib3QgPSBjKDEwLCAyMCwgMzApLCBkYXQpIHsKICBuZGVwdGggPC0gbGVuZ3RoKGRlcHRoX2JvdCkKICBkZiA8LSBkYXRhLmZyYW1lKFllYXIgPSByZXAoeWVhciwgbmRlcHRoICogbGVuZ3RoKHBtKSksCiAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChwbSwgZWFjaCA9IG5kZXB0aCAqIGxlbmd0aChlY28pKSwKICAgICAgICAgICAgICAgICAgIEVDTyA9IHJlcChlY28sIGVhY2ggPSBuZGVwdGgpKQogIGRmJGx5cl9ib3QgPC0gZGVwdGhfYm90CiAgZGYkbHlyX3RvcCA8LSBzYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIGlmIChpID09IDEpIHsKICAgICAgZGVwdGhfdG9wIDwtIDAKICAgICAgfSBlbHNlIHsKICAgICAgICBkZXB0aF90b3AgPC0gZGVwdGhfYm90W2kgLSAxXQogICAgICB9CiAgfSkKICBkZiRwcm9fbmFtZSA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wIikKICBuIDwtIG5yb3coZGYpCiAgaWYgKGRhdCA9PSAiaW5jIikgewogICAgZGYgPC0gcmJpbmQoZGYsIGRmKQogICAgZGYkcmVwIDwtIHJlcChjKCJhIiwgImIiKSwgZWFjaCA9IG4pCiAgICBkZiRseXJfbmFtZSA8LSBwYXN0ZTAoZGYkcHJvX25hbWUsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkbHlyX3RvcCwgIi0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfYm90LCAiXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJFllYXIsICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRyZXApCiAgfSBlbHNlIGlmIChkYXQgPT0gImRlbnNpdHkiKSB7CiAgICBkZiA8LSByYmluZChkZiwgZGYsIGRmKQogICAgZGYkZnJjIDwtIHJlcChjKCJmTEYiLCAib0xGIiwgIm1uQyIpLCBlYWNoID0gbikKICAgIGRmJGx5cl9uYW1lIDwtIHBhc3RlMChkZiRwcm9fbmFtZSwgIl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRseXJfdG9wLCAiLSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGx5cl9ib3QsICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGYkWWVhciwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmJGZyYykKICB9CiAgcmV0dXJuKGRmKQp9CgojIHRlbXBsYXRlcyBmb3IgYnVsayBzb2lsIGRhdGEKIyBHUnJmIApHUnJmIDwtIHRlbXBsYXRlMTkuZngoIkdSIiwgInJmIiwgNykKR1JyZiA8LSBpZihhbnkoR1JyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIikpIHsKICBHUnJmIDwtIEdScmZbLXdoaWNoKEdScmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpLCBdICMgTkI6IEdScmZfMV82MF83MCBkb2Vzbid0IGV4aXN0Cn0gZWxzZSB7CiAgR1JyZiA8LSBHUnJmCn0KIyBHUndmCkdSd2YgPC0gdGVtcGxhdGUxOS5meCgiR1IiLCAid2YiLCA5KQojIEdScHAKR1JwcCA8LSB0ZW1wbGF0ZTE5LmZ4KCJHUiIsICJwcCIsIDgpCgojIEFOcmYgCkFOcmYgPC0gdGVtcGxhdGUxOS5meCgiQU4iLCAicmYiLCA2KQojIEFOd2YKQU53ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJBTiIsICJ3ZiIsIDYpCiMgQU5wcApBTnBwIDwtIHRlbXBsYXRlMTkuZngoIkFOIiwgInBwIiwgOCkKCiMgQlNyZiAKQlNyZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJyZiIsIDgpCkJTcmYgPC0gaWYoYW55KEJTcmYkbHlyX25hbWUgPT0gIkdScmZfMV82MF83MCIpKSB7CiAgQlNyZiA8LSBCU3JmWy13aGljaChCU3JmJGx5cl9uYW1lID09ICJCU3JmXzFfNzBfODAiKSwgXSAjIE5COiBCU3JmXzFfNzBfODAgZG9lc24ndCBleGlzdAp9IGVsc2UgewogIEJTcmYgPC0gQlNyZgp9IAojIEJTd2YKQlN3ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJCUyIsICJ3ZiIsIDcpCiMgQlNwcApCU3BwIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgInBwIiwgOCkKQlNwcFtCU3BwJGx5cl9ib3QgPT0gODAsICJseXJfYm90Il0gPC0gNzUgIyBvbmx5IHNhbXBsZWQgdG8gNzVjbSwgbm90IDgwCgpzcmEuMjAxOS5kZiA8LSByYmluZChHUnJmLCBHUndmLCBHUnBwLAogICAgICAgICAgICAgICAgICAgICBBTnJmLCBBTndmLCBBTnBwLAogICAgICAgICAgICAgICAgICAgICBCU3JmLCBCU3dmLCBCU3BwKQoKIyB0ZW1wbGF0ZSBmb3IgMjAxOSBpbmN1YmF0aW9uIGRhdGEKc3JhLjIwMTkuaW5jLmRmIDwtIHRlbXBsYXRlLmNvbXAuZngoMjAxOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtID0gYygiQU4iLCAiQlMiLCAiR1IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gYygicHAiLCAid2YiLCAicmYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCgojIyB0ZW1wbGF0ZSBmb3IgMjAwMSBpbmN1YmF0aW9uIGRhdGEKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBpbmMgc2FtcGxlcwpkZXB0aF9ib3RfMjAwMS5scyA8LSBsaXN0KEFOcHAgPSBjKDYsIDEzLCAzMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQU53ZiA9IGMoMTEsIDM1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTnJmID0gYygxMSwgMzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcHAgPSBjKDcsIDE4LCAyOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlN3ZiA9IGMoMTAsIDE5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3JmID0gYyg4LCAxNSwgMzApLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScHAgPSBjKDcsIDE1LCAyNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1J3ZiA9IGMoNCwgMTMsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUnJmID0gYyg4LCAyNykpIAojIHRlbXBsYXRlIGZvciBpbnB1dHMgdG8gdGVtcGxhdGUuY29tcC5meCAoeWVhciwgcG0sIGVjbykKaW5jLjIwMDEudGVtcGxhdGUgPC0gbGFwcGx5KHNlcV9hbG9uZyhkZXB0aF9ib3RfMjAwMS5scyksIGZ1bmN0aW9uKGkpIHsKICBubXMgPC0gbmFtZXMoZGVwdGhfYm90XzIwMDEubHMpCiAgbHMgPC0gbGlzdCh5ZWFyID0gMjAwMSwgCiAgICAgICAgICAgICBwbSA9IHN1YnN0cihubXNbaV0sIDEsIDIpLCAKICAgICAgICAgICAgIGVjbyA9IHN1YnN0cihubXNbaV0sIDMsIDQpKQogIGxzJGRlcHRoX2JvdCA8LSBkZXB0aF9ib3RfMjAwMS5sc1tbaV1dCiAgcmV0dXJuKGxzKQp9KQojIGNyZWF0ZSB0ZW1wbGF0ZSBkYXRhIGZyYW1lIGJ5IGl0ZXJhdGl2ZWx5IGNhbGxpbmcgdGVtcGxhdGUuY29tcC5meApzcmEuMjAwMS5pbmMuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzZXFfYWxvbmcoaW5jLjIwMDEudGVtcGxhdGUpLCBmdW5jdGlvbihpKSB7CiAgICB0ZW1wbGF0ZS5jb21wLmZ4KHllYXIgPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgIHBtID0gaW5jLjIwMDEudGVtcGxhdGVbW2ldXVtbMl1dLAogICAgICAgICAgICAgICAgICAgICBlY28gPSBpbmMuMjAwMS50ZW1wbGF0ZVtbaV1dW1szXV0sCiAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2JvdCA9IGluYy4yMDAxLnRlbXBsYXRlW1tpXV1bWzRdXSwKICAgICAgICAgICAgICAgICAgICAgZGF0ID0gImluYyIpCiAgfSkKKQoKIyAyMDAxIGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAwMSA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMSkgPC0gdW5pcXVlKHNyYS4yMDE5LmRmJHByb19uYW1lKQoKIyAyMDE5IGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAxOSA8LSBzcmEuMjAwMQoKIyBpbmMgdGVtcGxhdGVzIGZvciBtZXJnaW5nIDE0QyBkYXRhCnNyYS4yMDE5LmluYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpKSkKbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSB1bmlxdWUoc3JhLjIwMTkuaW5jLmRmJHByb19uYW1lKQpzcmEuMjAwMS5pbmMgPC0gc3JhLjIwMTkuaW5jCiMgY29waWVzIGZvciByZXBzIG9mIGluY3ViYXRpb25zCnNyYS4yMDE5LmluY19MIDwtIHNyYS4yMDE5LmluYwpuYW1lcyhzcmEuMjAxOS5pbmNfTCkgPC0gc3Vic3RyKG5hbWVzKHNyYS4yMDE5LmluY19MKSwgMSwgNCkKYGBgCgpgYGB7ciBhdmVyYWdlLWNuLWRhdGF9CiMgY29tcGxldGUgY2FzZXMsIGNvbnZlcnQgdHlwZSBmb3IgY2FsY3VsYXRpbmcgc3RvY2tzIGxhdGVyCiMgY291bGQgY2FsY3VsYXRlIHN0b2NrcyBub3cgYW5kIHRoZW4gcmVtb3ZlIGZvciB0aGUgZm9sbG93aW5nIHN0ZXBzIHdoZXJlIG5vdCBuZWVkZWQKCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBjcmVhdGUgbGlzdDsgcmVtb3ZlIEJTIHNhbXBsZXMgZGVlcGVyIHRoYW4gMzAgY20Kc29jLjIwMDEubHMgPC0gbGFwcGx5KHNwbGl0KHNvYy4yMDAxLCBzb2MuMjAwMSRQTWVjbyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gdHlwZS5jb252ZXJ0KGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgYygiSUQiLCAiQy4iLCAibWFzc19rZ20yIiwgImJkLmcuY20zIiwgIlBNZWNvIiwgInByb19yZXAiLCAibHlyX3RvcCIsICJseXJfYm90IildKQogcmV0dXJuKGRmW3doaWNoKGRmJGx5cl9ib3QgPCAzNiksIF0pCn0pCgojIEluY3ViYXRpb24gc2FtcGxlcyBjb21iaW5lZCAwLTMgYW5kIDMtOCBkZXB0aCBpbmNyZW1lbnRzIGZvciBCU3JmIGFuZCBHUnJmCiMgY29tYmluZSBCU3JmIGFuZCBHUnJmIGluaXRpYWwgZGVwdGhzCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgZmlyc3QgdHdvIGRlcHRoIGluY3JlbWVudCBDIGNvbnRlbnQKZDFkMi5meCA8LSBmdW5jdGlvbihkZikgewogIGQxZDIgPC0gZGF0YS5mcmFtZShJRCA9IHBhc3RlKGRmJFBNZWNvWzFdLCBkZiRwcm9fcmVwWzFdLCBkZiRseXJfdG9wWzFdLCBkZiRseXJfYm90WzJdLCBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgICAgICBDLiA9IHN1bShkZiRDLlsxXSAqICgoZGYkbHlyX2JvdFsxXSAtIGRmJGx5cl90b3BbMV0pIC8gZGYkbHlyX2JvdFsyXSksIGRmJEMuWzJdICogKChkZiRseXJfYm90WzJdIC0gZGYkbHlyX3RvcFsyXSkgLyBkZiRseXJfYm90WzJdKSksCiAgICAgICAgICAgICAgICAgICAgIG1hc3Nfa2dtMiA9IHN1bShkZiRtYXNzX2tnbTJbMV0sIGRmJG1hc3Nfa2dtMlsyXSksCiAgICAgICAgICAgICAgICAgICAgIFBNZWNvID0gZGYkUE1lY29bMV0sCiAgICAgICAgICAgICAgICAgICAgIHByb19yZXAgPSBkZiRwcm9fcmVwWzFdLAogICAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gZGYkbHlyX3RvcFsxXSwKICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IGRmJGx5cl9ib3RbMl0pCiAgcmV0dXJuKHJiaW5kKGQxZDIsCiAgICAgICAgICAgICAgIGRmWzM6bnJvdyhkZiksIF0pKQp9CiMgUnVuIGQxZDIuZnggZm9yIEJTcmYsIEdScmYKc29jLjIwMDEubHMuaW5jIDwtIHNvYy4yMDAxLmxzIApzb2MuMjAwMS5scy5pbmMkR1JyZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KHNvYy4yMDAxLmxzJEdScmYsIHNvYy4yMDAxLmxzJEdScmYkcHJvX3JlcCksIGQxZDIuZngpKQoKIyBhbHNvIG5lZWQgd2VpZ2h0ZWQgJUMgZm9yIGZsdXggd2VpZ2h0aW5nCkJTcmZfY29tcF8wMV9wY3RDIDwtIHNvYy4yMDAxLmxzLmluYyRCU3JmW3doaWNoKHNvYy4yMDAxLmxzLmluYyRCU3JmJGx5cl9ib3QgPCA5KSwgXQppZiAoYW55KGMoZ3JlcGwoIkJTcmZfMl8wIiwgQlNyZl9jb21wXzAxX3BjdEMkSUQpLCBncmVwbCgiQlNyZl8zXzAiLCBCU3JmX2NvbXBfMDFfcGN0QyRJRCkpKSkgewogIEJTcmZfY29tcF8wMV9wY3RDIDwtIEJTcmZfY29tcF8wMV9wY3RDWy13aGljaChCU3JmX2NvbXBfMDFfcGN0QyRJRCA9PSAiQlNyZl8zXzAtMyIgfCBCU3JmX2NvbXBfMDFfcGN0QyRJRCA9PSAiQlNyZl8yXzAtMyIpLCBdCn0KQlNyZl9jb21wXzAxX3BjdEMkbWFzc193dCA8LSBjKDE1IC8gMzAsIHJlcCgoNSAvIDMwKSwgMykpCkJTcmZfY29tcF8wMV9wY3RDJGNfcGN0X3d0ZCA8LSBCU3JmX2NvbXBfMDFfcGN0QyRDLiAqIEJTcmZfY29tcF8wMV9wY3RDJG1hc3Nfd3QKCiMgc3VtbWFyaXplIFNPQwpzb2MuMjAwMS5zdW0gPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KHNvYy4yMDAxLmxzLmluYywgZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIG11dGF0ZShJRDIgPSBwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KSkgJT4lCiAgICBncm91cF9ieShJRDIsIFBNZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICAgIGRwbHlyOjpzdW1tYXJpemUoY19wY3RfYXZnID0gbWVhbihDLikpCn0pKSkKaWYgKGxlbmd0aCh3aGljaChzb2MuMjAwMS5zdW0kSUQyID09ICJCU3JmXzAtMyIgfCBzb2MuMjAwMS5zdW0kSUQyID09ICJCU3JmXzMtOCIpKSA9PSAyKSB7CiAgc29jLjIwMDEuc3VtMiA8LSBzb2MuMjAwMS5zdW1bLXdoaWNoKHNvYy4yMDAxLnN1bSRJRDIgPT0gIkJTcmZfMC0zIiB8IHNvYy4yMDAxLnN1bSRJRDIgPT0gIkJTcmZfMy04IiksIF0KICBzb2MuMjAwMS5zdW0yIDwtIHJiaW5kKAogICAgc29jLjIwMDEuc3VtMiwKICAgIGMoIkJTcmZfMC04IiwgIkJTcmYiLCAwLCA4LCBzdW0oQlNyZl9jb21wXzAxX3BjdEMkY19wY3Rfd3RkKSkpCn0KCgojIHN1bW1hcml6ZSBpbmMKc29jLjIwMDEuaW5jLnN1bSA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkoc29jLjIwMDEubHMuaW5jLCBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgbXV0YXRlKElEMiA9IHBhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpKSAlPiUKICAgIGdyb3VwX2J5KElEMiwgUE1lY28sIGx5cl90b3AsIGx5cl9ib3QpICU+JQogICAgZHBseXI6OnN1bW1hcml6ZShjX3BjdF9hdmcgPSBtZWFuKEMuKSkKfSkpKQpzYXZlKHNvYy4yMDAxLmluYy5zdW0sIGZpbGUgPSAic29jLjIwMDEuaW5jLnN1bS5SRGF0YSIpCgojIGNhbGN1bGF0ZSBTT0Mgc3RvY2tzCnNvYy4yMDAxLmxzIDwtIGxhcHBseShzb2MuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jX2tnbTIgPC0gZGYkQy4gKiBkZiRtYXNzX2tnbTIgKiAxMF4tMgogIHJldHVybihkZikKfSkKCiMgMjAxOSBkYXRhCnNyYS4yMDE5LmNuLnN1bSA8LSBkYXRhLmZyYW1lKAogIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlKFBNZWNvID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDIpLAogICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChJRCwgIl8iKSwgIlsiLCA0KSkgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIGRlcHRoKSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKGFjcm9zcyhjKEMsIE4pLCAuZm5zID0gbWVhbikpKSAlPiUKICByZW5hbWUoY19wY3RfYXZnID0gQywKICAgICAgICAgbl9wY3RfYXZnID0gTikKc3JhLjIwMTkuY24uc3VtJElEMiA8LSBwYXN0ZShzcmEuMjAxOS5jbi5zdW0kUE1lY28sIHNyYS4yMDE5LmNuLnN1bSRkZXB0aCwgc2VwID0gIl8iKQpzYXZlKHNyYS4yMDE5LmNuLnN1bSwgZmlsZSA9ICJzcmEuMjAxOS5jbi5zdW0uUkRhdGEiKQpgYGAKCipNZXJnZSB0ZW1wbGF0ZXMgd2l0aCAxNEMsIEMsIGFuZCBOIGRhdGEqCgpSYWRpb2NhcmJvbiBhbmFseXNlcyBmb3IgdGhlIDIwMDEgc2FtcGxlcyB3ZXJlIG5vdCBydW4gb3JpZ2luYWxseSwgYnV0IHdlcmUgY29tcGxldGVkIG9uIGFyY2hpdmVkIHNhbXBsZXMgaW4gMjAyMC4KCmBgYHtyIG1lcmdlLWlzby1kYXRhLVMwMS1zb2lsfQojIEV4dHJhY3QgMTRDIGRhdGEgZm9yIDIwMDEgc2FtcGxlcwphbXNfcmVzdWx0c19sc19TMDEgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgiUzAxIiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KZm9yKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDAxKSkgewogIHNyYS4yMDAxW1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX1MwMSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDAxKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAwMSlbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDAxW1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDAxW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAwMSA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDAxLCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIGNyZWF0ZSBJRCBmaWVsZCwgdHJpbSBkZiwgYW5kIGFkZCBkZXB0aHMKc3JhLjIwMDEkSUQgPC0gdW5saXN0KHN0cnNwbGl0KHNyYS4yMDAxJFByb2JlLCAiX1NpZXJyYSBOZXZhZGFfMjAwMSIpKQpzcmEuMjAwMSA8LSBzcmEuMjAwMVsgLCBjKCJJRCIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDAxKSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCnNyYS4yMDAxJGx5cl90b3AgPC0gYXMubnVtZXJpYyhpZmVsc2Uoc3Vic3RyKHNyYS4yMDAxJElELCA5LCA5KSA9PSAiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCA4LCA4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDgsIDkpKSkKc3JhLjIwMDEkbHlyX2JvdCA8LSBhcy5udW1lcmljKGlmZWxzZShzdWJzdHIoc3JhLjIwMDEkSUQsIDksIDkpID09ICItIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCAxMCwgbmNoYXIoc3JhLjIwMDEkSUQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoc3JhLjIwMDEkSUQsIDExLCBuY2hhcihzcmEuMjAwMSRJRCkpKSkKc3JhLjIwMDEkcHJvX3JlcCA8LSBzdWJzdHIoc3JhLjIwMDEkSUQsIDYsIDYpCnNyYS4yMDAxJFBNIDwtIGZhY3RvcihzdWJzdHIoc3JhLjIwMDEkSUQsIDEsIDIpKQpzcmEuMjAwMSRFQ08gPC0gZmFjdG9yKHN1YnN0cihzcmEuMjAwMSRJRCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCnNyYS4yMDAxJHByb19uYW1lIDwtIHN1YnN0cihzcmEuMjAwMSRJRCwgMSwgNikKc3JhLjIwMDEkUE1lY28gPC0gc3Vic3RyKHNyYS4yMDAxJElELCAxLCA0KQoKIyByZW1vdmUgb3V0bGllciBBTnBwIHNhbXBsZQpzcmEuMjAwMSA8LSBzcmEuMjAwMVstd2hpY2goc3JhLjIwMDEkSUQgPT0gIkFOcHBfM182LTEzIiksIF0KCiMgbWFrZSBsaXN0IGJ5IFBNZWNvCnNyYS4yMDAxLmxzIDwtIHNwbGl0KHNyYS4yMDAxLCBzcmEuMjAwMSRQTWVjbykKYGBgCgpgYGB7ciBtZXJnZS1pc28tZGF0YS1zb2lsLVMxOX0KIyBFeHRyYWN0IDE0QyBkYXRhIGZvciAyMDE5IHNhbXBsZXMKYW1zX3Jlc3VsdHNfbHNfUzE5IDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoInNvaWwtUzE5IiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KZm9yKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDE5KSkgewogIHNyYS4yMDE5W1tpXV0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzX1MxOSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5KVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAxOSlbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5W1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDE5W1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAxOSA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDE5LCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIyBtZXJnZSB3LyAyMDE5IHRlbXBsYXRlCiMgcmVuYW1lIGNvbHMgaW4gQU1TIHRhYmxlcwpzcmEuMjAxOSA8LSBzcmEuMjAxOVsgLCBjKCJQcm9iZSIsICJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIildCm5hbWVzKHNyYS4yMDE5KSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCiMgbWVyZ2UKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmRmLCBzcmEuMjAxOS5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gbWVyZ2UoZGYsIHNyYS4yMDE5W2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDE5JElEKSwgXSkKICBkZiRJRCA8LSBOVUxMCiAgZGYkUE1lY28gPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08pCiAgcmV0dXJuKGRmKQp9KQoKIyByZXNoYXBlIGxpc3QgYnkgUE1lY28Kc3JhLjIwMTkubHMgPC0gc3BsaXQoYmluZF9yb3dzKHNyYS4yMDE5LmxzKSwgYmluZF9yb3dzKHNyYS4yMDE5LmxzKVtbIlBNZWNvIl1dKQpgYGAKCmBgYHtyIG1lcmdlLWlzby1kYXRhLWNvMn0KIyMjIEV4dHJhY3QgMTRDIGRhdGEgZm9yIGluY3ViYXRpb24gc2FtcGxlcwojIyByZXNwaXJlZCBDTzIsIHNvaWwKIyAyMDE5CmFtc19yZXN1bHRzX2xzX2NvMl9TMTkgPC0gYW1zX3Jlc3VsdHNfbHNbZ3JlcCgiY28yLVMxOSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvciAoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkuaW5jKSkgewogIHNyYS4yMDE5LmluY1tbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19jbzJfUzE5LCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZiAoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5LmluYylbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgICBkZltncmVwKG5hbWVzKHNyYS4yMDE5LmluYylbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5LmluY1tbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAxOS5pbmNbW2ldXSwgcmVjdXJzaXZlID0gRkFMU0UpKQp9CnNyYS4yMDE5LmluYyA8LSB0eXBlLmNvbnZlcnQoCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHVubGlzdChzcmEuMjAxOS5pbmMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgCiAgICAgICAgICAgZnVuY3Rpb24oeCkgeCAlPiUgbXV0YXRlX2FsbChhcy5jaGFyYWN0ZXIpKSksCiAgYXMuaXMgPSBUUlVFKQpzcmEuMjAxOS5pbmMgPC0gc3JhLjIwMTkuaW5jWy13aGljaChpcy5uYShzcmEuMjAxOS5pbmMkRjE0QykpLCBdCgojIDIwMDEKYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJjbzItUzAxIiwgbmFtZXMoYW1zX3Jlc3VsdHNfbHMpKV0KIyByZW1vdmUgcXVlc3Rpb25hYmxlL2R1cGxpY2F0ZSBzYW1wbGVzCiMgQU5yZl9jb21wXzExLTMyXzIwMDFfYSAoYW5hbHl6ZWQgdHdpY2U7IGJvdGggYW5vbW91c2x5IGxvdyBjb21wYXJlZCB0byByZXAgYW5kIHJlc3Qgb2YgZGF0YSkKYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMi54bHN4YCA8LSBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xMWAkYEJlZW0tTWlsbGVyXzIyLnhsc3hgWy1ncmVwKCJBTnJmX2NvbXBfMTEtMzJfMjAwMV9hIiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMi54bHN4YCRQcm9iZSksIF0KYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzNfcmVzdWx0cy54bHN4YCA8LSBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMC0xMi0xNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfM19yZXN1bHRzLnhsc3hgWy1ncmVwKCJBTnJmX2NvbXBfMTEtMzJfMjAwMV9hIiwgYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTZgJGAxNENfU2llcnJhTmV2YWRhX0luY18yMDAxXzNfcmVzdWx0cy54bHN4YCRQcm9iZSksIF0KIyBmcm9tIG9yaWdpbmFsIGFuYWx5c2lzIG9mIHNhbXBsZXMgZXh0cmFjdGVkIG9ubGluZSAxMS1EZWMtMjAyMCAoc2VlIHJlYWRtZSBmb3Igbm90ZXMpCmFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIwLTEyLTExYCRgQmVlbS1NaWxsZXJfMjMueGxzeGAgPC0gYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSRgYW1zX2plbmFfcmVzdWx0cy1jbzItUzAxXzIwMjAtMTItMTFgJGBCZWVtLU1pbGxlcl8yMy54bHN4YFstZ3JlcCgiR1J3Zl9jb21wXzEzLTI4XzIwMDFfYV8xMSIsIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAkUHJvYmUpLCBdCiMgZnJvbSByZWFuYWx5c2lzIG9mIHNhbXBsZXMgZXh0cmFjdGVkIG9ubGluZSAxMS1EZWMtMjAyMCAoc2VlIHJlYWRtZSBmb3Igbm90ZXMpCiMgR1JyZl9jb21wXzgtMjdfMjAwMV9hXzUsIEdScmZfY29tcF84LTI3XzIwMDFfYl82LCBHUnBwX2NvbXBfMTUtMjdfMjAwMV9iXzE4IAphbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMS0wMS0yNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfMl9yZXN1bHRzLnhsc3hgIDwtIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGBbYygKICBncmVwKCJHUnJmX2NvbXBfOC0yN18yMDAxX2FfNSIsIGFtc19yZXN1bHRzX2xzX2NvMl9TMDEkYGFtc19qZW5hX3Jlc3VsdHMtY28yLVMwMV8yMDIxLTAxLTI2YCRgMTRDX1NpZXJyYU5ldmFkYV9JbmNfMjAwMV8yX3Jlc3VsdHMueGxzeGAkUHJvYmUpLAogIGdyZXAoIkdSd2ZfY29tcF8xMy0yOF8yMDAxX2JfMTIiLCBhbXNfcmVzdWx0c19sc19jbzJfUzAxJGBhbXNfamVuYV9yZXN1bHRzLWNvMi1TMDFfMjAyMS0wMS0yNmAkYDE0Q19TaWVycmFOZXZhZGFfSW5jXzIwMDFfMl9yZXN1bHRzLnhsc3hgJFByb2JlKSksIF0KCiMgY3JlYXRlIHRlbXBsYXRlIGZvciBleHRyYWN0aW5nIGRhdGEKc3JhLjIwMDEuaW5jIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgodW5pcXVlKHNyYS4yMDE5LmluYy5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMS5pbmMpIDwtIHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpCiMgbWVyZ2Ugd2l0aCAxNEMgZGF0YQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDAxLmluYykpIHsKICBzcmEuMjAwMS5pbmNbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfY28yX1MwMSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYgKGFueShncmVwbChuYW1lcyhzcmEuMjAwMS5pbmMpW2ldLCBkZiRQcm9iZSkpKSB7CiAgICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAwMS5pbmMpW2ldLCBkZiRQcm9iZSksIF0gCiAgICAgIH0KICAgIH0pCiAgfSkKICBzcmEuMjAwMS5pbmNbW2ldXSA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCB1bmxpc3Qoc3JhLjIwMDEuaW5jW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAwMS5pbmMgPC0gdHlwZS5jb252ZXJ0KAogIGJpbmRfcm93cygKICAgIGxhcHBseSh1bmxpc3Qoc3JhLjIwMDEuaW5jLCByZWN1cnNpdmUgPSBGQUxTRSksIAogICAgICAgICAgIGZ1bmN0aW9uKHgpIHggJT4lIG11dGF0ZV9hbGwoYXMuY2hhcmFjdGVyKSkpLAogIGFzLmlzID0gVFJVRSkKc3JhLjIwMDEuaW5jIDwtIHNyYS4yMDAxLmluY1std2hpY2goaXMubmEoc3JhLjIwMDEuaW5jJEYxNEMpKSwgXQoKIyByZXNwaXJlZCBDTzIsIGxpdHRlcgphbXNfcmVzdWx0c19sc19jbzJfTDE5IDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoImNvMi1MMTkiLCBuYW1lcyhhbXNfcmVzdWx0c19scykpXQpmb3IoaSBpbiBzZXFfYWxvbmcoc3JhLjIwMTkuaW5jX0wpKSB7CiAgc3JhLjIwMTkuaW5jX0xbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfY28yX0wxOSwgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgICAgaWYoYW55KGdyZXBsKG5hbWVzKHNyYS4yMDE5LmluY19MKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAxOS5pbmNfTClbaV0sIGRmJFByb2JlKSwgXSAKICAgICAgfQogICAgfSkKICB9KQogIHNyYS4yMDE5LmluY19MW1tpXV0gPC0gRmlsdGVyKE5lZ2F0ZShpcy5udWxsKSwgdW5saXN0KHNyYS4yMDE5LmluY19MW1tpXV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKfQpzcmEuMjAxOS5pbmNfTCA8LSBiaW5kX3Jvd3ModW5saXN0KHNyYS4yMDE5LmluY19MLCByZWN1cnNpdmUgPSBGQUxTRSkpCgojIyBtZXJnZSB3LyB0ZW1wbGF0ZXMgW3doeSBkbyBJIGRvIHRoaXMgdHdpY2U/XQojIHJlbmFtZSBjb2xzIGluIEFNUyB0YWJsZXMKIyBzb2lsIENPMgpzcmEuMjAxOS5pbmMgPC0gc3JhLjIwMTkuaW5jWyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkuaW5jKSA8LSBjKCJJRCIsICJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIpCnNyYS4yMDAxLmluYyA8LSBzcmEuMjAwMS5pbmNbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAwMS5pbmMpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKCiMgbWVyZ2UKIyAyMDE5CnNyYS4yMDE5LmluYy5scyA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmluYy5kZiwgc3JhLjIwMTkuaW5jLmRmJGx5cl9uYW1lKSwgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIG1lcmdlKGRmLCBzcmEuMjAxOS5pbmNbZ3JlcChkZiRseXJfbmFtZSwgc3JhLjIwMTkuaW5jJElEKSwgXSkKICAgIGRmJElEIDwtIE5VTEwKICAgIGRmJFBNZWNvIDwtIHBhc3RlMChkZiRQTSwgZGYkRUNPKQogICAgcmV0dXJuKGRmKQogIH0pCikKc3JhLjIwMTkuaW5jLmxzIDwtIHNwbGl0KHNyYS4yMDE5LmluYy5scywgc3JhLjIwMTkuaW5jLmxzJFBNZWNvKQojIHNhdmUgaW5jIGxpc3QKc2F2ZShzcmEuMjAxOS5pbmMubHMsIGZpbGUgPSAic3JhLjIwMTkuaW5jLmxzLlJEYXRhIikKCiMgMjAwMQpzcmEuMjAwMS5pbmMubHMgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYsIHNyYS4yMDAxLmluYy5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiA8LSBtZXJnZShkZiwgc3JhLjIwMDEuaW5jW2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDAxLmluYyRJRCksIF0pCiAgICBkZiRJRCA8LSBOVUxMCiAgICBkZiRQTWVjbyA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTykKICAgIHJldHVybihkZikKICB9KQopCnNyYS4yMDAxLmluYy5scyA8LSBzcGxpdChzcmEuMjAwMS5pbmMubHMsIHNyYS4yMDAxLmluYy5scyRQTWVjbykKCiMgc2F2ZSBpbmMgbGlzdApzYXZlKHNyYS4yMDAxLmluYy5scywgZmlsZSA9ICJzcmEuMjAwMS5pbmMubHMuUkRhdGEiKQoKIyBsaXR0ZXIgQ08yCnNyYS4yMDE5LmluY19MIDwtIHNyYS4yMDE5LmluY19MWyAsIGMoIlByb2JlIiwgIkYxNEMiLCAiZXJyIiwgIuKIhjE0Qy4o4oCwKSIsICJlcnIuKOKAsCkiKV0KbmFtZXMoc3JhLjIwMTkuaW5jX0wpIDwtIGMoIklEIiwgImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIikKc3JhLjIwMTkuaW5jX0wkSUQgPC0gc3Vic3RyKHN1YnN0cmluZyhzcmEuMjAxOS5pbmNfTCRJRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwcigiXyIsIHNyYS4yMDE5LmluY19MJElEKSArIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKHNyYS4yMDE5LmluY19MJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA4KQpzcmEuMjAxOS5pbmMuZGZfTCA8LSBkYXRhLmZyYW1lKFllYXIgPSByZXAoMjAxOSwgMTgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCA9IHJlcChjKDEsIDIpLCA5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChjKCJBTiIsICJCUyIsICJHUiIpLCBlYWNoID0gNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gcmVwKGMoInBwIiwgIndmIiwgInJmIiksIGVhY2ggPSAyLCB0aW1lcyA9IDMpKQpzcmEuMjAxOS5pbmMuZGZfTCRQTWVjbyA8LSBwYXN0ZTAoc3JhLjIwMTkuaW5jLmRmX0wkUE0sIHNyYS4yMDE5LmluYy5kZl9MJGVjbykKc3JhLjIwMTkuaW5jLmRmX0wkSUQgPC0gcGFzdGUwKHNyYS4yMDE5LmluYy5kZl9MJFBNLCBzcmEuMjAxOS5pbmMuZGZfTCRlY28sICItTF8iLCBzcmEuMjAxOS5pbmMuZGZfTCRyZXApCiMgYWRkIGRyeSB3dHMgYW5kIGxpdHRlciBkZXB0aApzcmEuMjAxOS5MIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvbGFiX2plbmFfbGl0dGVyL0xpdHRlcl8yMDE5XzIwMjEtMDEtMjcuY3N2IikKc3JhLjIwMTkuaW5jLmRmX0wgPC0gbWVyZ2Uoc3JhLjIwMTkuaW5jLmRmX0wsIHNyYS4yMDE5LkxbICwgYygiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IildLCBhbGwueCA9IFRSVUUpCiMgbWVyZ2UKc3JhLjIwMTkuaW5jX0wuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMjAxOS5pbmNfTCwgc3JhLjIwMTkuaW5jX0wkSUQpLCBmdW5jdGlvbihkZikgewogICAgZGYgPC0gbWVyZ2UoZGYsIHNyYS4yMDE5LmluYy5kZl9MLCBieSA9ICJJRCIpCiAgICBkZiRJRCA8LSBOVUxMCiAgICByZXR1cm4oZGYpCiAgfSkKKQpzcmEuMjAxOS5pbmNfTC5scyA8LSBzcGxpdChzcmEuMjAxOS5pbmNfTC5kZiwgc3JhLjIwMTkuaW5jX0wuZGYkUE1lY28pCmBgYAoKYGBge3IgcGxvdC11dGlsc30KIyBmbSBhbmQgZDE0YyBjb252ZXJzaW9uIGZ1bmN0aW9ucwpsYW1iZGEgPC0gMS84MjY3ICMgPSAxLyh0cnVlIG1lYW4gbGlmZSBvZiAxNEMpCmNhbGNfZm0gPC0gZnVuY3Rpb24oZDE0Yywgb2JzX2RhdGVfeSkgewogICgoZDE0Yy8xMDAwKSArIDEpL2V4cChsYW1iZGEgKiAoMTk1MCAtIG9ic19kYXRlX3kpKQp9CmNhbGNfMTRjIDwtIGZ1bmN0aW9uKGZtLCBvYnNfZGF0ZV95KSB7CiAgKGZtICogZXhwKGxhbWJkYSAqICgxOTUwIC0gb2JzX2RhdGVfeSkpIC0gMSkgKiAxMDAwCn0KCiMgY2FsYyBhdG0gaW4gMjAwMSwgMjAwOSwgMjAxOQpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQphdG0uZDE0LjIwMDEgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAwMS41LCAiTkhjMTQiXQphdG0uZm0uMjAwMSA8LSBjYWxjX2ZtKGF0bS5kMTQuMjAwMSwgMjAwMSkKYXRtLmQxNC4yMDA5IDwtIERhdG1bRGF0bSREYXRlID09IDIwMDkuNSwgIk5IYzE0Il0KYXRtLmZtLjIwMDkgPC0gY2FsY19mbShhdG0uZDE0LjIwMDksIDIwMDkpCmF0bS5kMTQuMjAxOSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDE5LjUsICJOSGMxNCJdCmF0bS5mbS4yMDE5IDwtIGNhbGNfZm0oYXRtLmQxNC4yMDE5LCAyMDE5KQpgYGAKCmBgYHtyIHBsb3QtbGl0dGVyLTE0Y30KIyBzdW1tYXJpemUgbGl0dGVyIGluYyBkYXRhCnNyYS4yMDE5LmluY19MLnN1bSA8LSBzcmEuMjAxOS5pbmNfTC5kZiAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShlY28gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY28gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSksCiAgICAgICAgIFllYXIgPSBmYWN0b3IoIjIwMTkiKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgUE1lY28sIHBtLCBlY28sIGx5cl90b3AsIGx5cl9ib3QpICU+JQogIHN1bW1hcml6ZShkMTRjX21lYW4gPSBtZWFuKGQxNGMpLAogICAgICAgICAgICBkMTRjX3UgPSBtYXgoZDE0YyksCiAgICAgICAgICAgIGQxNGNfbCA9IG1pbihkMTRjKSwKICAgICAgICAgICAgZm1fbWVhbiA9IG1lYW4oZm0pLAogICAgICAgICAgICBmbV91ID0gbWF4KGZtKSwKICAgICAgICAgICAgZm1fbCA9IG1pbihmbSkpCgojIHBsb3QgYXMgY29scyBieSBjbGltYXRlCnNyYS4yMDE5LmluY19MLnN1bSAlPiUKICBtdXRhdGUoTUFUID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSwgbGFiZWxzID0gYygiMTAtMTMiLCAiOC0xMCIsICI1LTYiKSkpICU+JQogIGdncGxvdCguLCBhZXMoTUFULCBkMTRjX21lYW4sIGZpbGwgPSBwbSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UyIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltYXggPSBkMTRjX3UsIHltaW4gPSBkMTRjX2wsIGNvbG9yID0gcG0pLCAKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjUsIHBhZGRpbmcgPSAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgY29vcmRfZmxpcCgpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbigiTUFUICgiKn5kZWdyZWUqQyoiKSIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCBhcyBwb2ludHMgd2l0aCBkZXB0aApzcmEuMjAxOS5pbmNfTC5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl90b3AsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtYXggPSBkMTRjX3UsIHhtaW4gPSBkMTRjX2wpLCBoZWlnaHQgPSAxKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbykpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIExpdHRlciBpbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMtQ09+Mn4gKDIwMTkpKioKCj4qQ2FwdGlvbjoqIE1lYW4gJFxEZWx0YSReMTReQy1DT34yfiBmb3IgZWFjaCBzaXRlLiBFcnJvciBiYXJzIHNob3cgbWluIGFuZCBtYXggb2YgZHVwbGljYXRlIGluY3ViYXRpb24gc2FtcGxlcy4gXmEpXiBEYXRhIHNob3duIGJ5IHNpdGUsIHdpdGhvdXQgbGl0dGVyIGRlcHRoLCBeYileIERhdGEgc2hvd24gYnkgZGVwdGggb2YgbGl0dGVyIGxheWVyLCBiaW5uZWQgYnkgY2xpbWF0ZSB6b25lLgoKYGBge3IgcGxvdC0xNGMtcHJvZmlsZS1meH0KcHJvLnBsb3QgPC0gZnVuY3Rpb24oZGYsIG1heERlcHRoLCBtaW4xNEMsIHJlcCkgewogIGdncGxvdChkZiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gUE0sIHNoYXBlID0gRUNPLCBncm91cCA9IHJlcCkpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heERlcHRoLCAwKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluMTRDLCAxODApKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcCIgPSBleHByZXNzaW9uKGl0YWxpYygiUC4gcG9uZGVyb3NhIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IGV4cHJlc3Npb24oaXRhbGljKCJBLiBtYWduaWZpY2EiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gZXhwcmVzc2lvbihpdGFsaWMoIkEuIGNvbmNvbG9yIikpKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDE3KSkgKwogICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KYGBgCgpgYGB7ciBwbG90LTIwMDEtcHJvZmlsZXN9CiMgbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgcHJvLnBsb3QoZGYsIG1heChkZiRseXJfYm90KSwgbWluKGRmJGQxNGMpLCBkZiRwcm9fcmVwKSkKYGBgCgpgYGB7ciBwbG90LTIwMTktcHJvZmlsZXN9CiMgbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgcHJvLnBsb3QoZGYsIG1heChkZiRseXJfYm90KSwgbWluKGRmJGQxNGMpLCBkZiRwcm9fcmVwKSkKYGBgCgpgYGB7ciBwbG90LTIwMTktY28yLXByb2ZpbGVzfQojIGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIE5BKSkKYGBgCgojIyAyMDAxIG1lYW4gcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgcGxvdC0yMDAxLWF2Zy1wcm9maWxlc30KIyBjb21iaW5lIHJlcHMKc3JhLjIwMDEuc3VtLmxzICA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShkZiAlPiUKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGx5cl9ib3QgPD0gNDApICU+JQogICAgICAgICAgICAgICAgICAgICBtdXRhdGUobHlyX3RvcF9jaCA9IGFzLmNoYXJhY3RlcihseXJfdG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3RfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX2JvdCkpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoUE0sIEVDTywgUE1lY28sIGZtLCBkMTRjLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE0sIEVDTywgUE1lY28sIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpKQogIG5hbWVzKGRmKSA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImQxNGMiLCAiZm1fc2QiLCAiZDE0Y19zZCIpCiAgZGYkbHlyX3RvcCA8LSBhcy5udW1lcmljKGRmJGx5cl90b3ApCiAgZGYkbHlyX2JvdCA8LSBhcy5udW1lcmljKGRmJGx5cl9ib3QpCiAgZGYkZDE0Y191IDwtIGRmJGQxNGMgKyBkZiRkMTRjX3NkCiAgZGYkZDE0Y19sIDwtIGRmJGQxNGMgLSBkZiRkMTRjX3NkCiAgcmV0dXJuKGRmW29yZGVyKGRmJGx5cl9ib3QpLCBdKQp9KQpzcmEuMDEuc3VtIDwtIGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMpICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgcGxvdApzcmEuMDEuc3VtICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAwLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDAxIHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24sIHNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4KCiMjIDIwMDkgcmFkaW9jYXJib24gcHJvZmlsZXMKYGBge3IgbG9hZC0yMDA5LWRhdGF9CiMgMjAwOSBzdW1tYXJ5IGRhdGEgKGZyb20gQy4gUmFzbXVzc2VuKQpyYXMxOC5zdW0gPC0gcmVhZF9leGNlbCgKICAiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgc2hlZXQgPSAiRGF0YV9TdW1tYXJ5XzIwMThfcGFwZXIiKQoKIyByZW1vdmUgZW1wdHkgZGF0YSByb3dzCnJhczE4LnN1bSA8LSByYXMxOC5zdW1bLXdoaWNoKGlzLm5hKHJhczE4LnN1bSRgU2FtcGxlIElEYCkpLCBdCgojIHN1bW1hcml6ZSAwOSBkYXRhCnNyYS4wOS5zdW0gPC0gcmFzMTguc3VtICU+JQogIG11dGF0ZSgKICAgIEVDTyA9IGlmZWxzZShCaW9tZSA9PSAiUFAiLCAicHAiLCBpZmVsc2UoQmlvbWUgPT0gIldGIiwgIndmIiwgInJmIikpLAogICAgUE0gPSBpZmVsc2UoUGFyZW50X01hdGVyaWFsID09ICJBbmRlc2l0ZSIsICJBTiIsIGlmZWxzZShQYXJlbnRfTWF0ZXJpYWwgPT0gIkJhc2FsdCIsICJCUyIsICJHUiIpKSwKICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgcG0gPSBwYXN0ZTAodG9sb3dlcihzdWJzdHIoUGFyZW50X01hdGVyaWFsLCAxLCAxKSksIAogICAgICAgICAgICAgICAgc3Vic3RyKFBhcmVudF9NYXRlcmlhbCwgMiwgbmNoYXIoUGFyZW50X01hdGVyaWFsKSkpLAogICAgbWFzc19rZ20yID0gQkRfZ19jbV8zICogU29pbF9maW5lZnJhY3Rpb24gKiAoYGJvdHRvbSBtaW5lcmFsYCAtIGB0b3AgbWluZXJhbGApICogMTApICU+JQogIG11dGF0ZShQTWVjbyA9IHBhc3RlMChQTSwgRUNPKSkgJT4lCiAgcmVuYW1lKGQxNGMgPSAizpQxNEMiLAogICAgICAgICBseXJfYm90ID0gImJvdHRvbSBtaW5lcmFsIiwKICAgICAgICAgbHlyX3RvcCA9ICJ0b3AgbWluZXJhbCIpCnNyYS4yMDA5LmxzIDwtIGxhcHBseShzcGxpdChzcmEuMDkuc3VtLCBzcmEuMDkuc3VtJFBNZWNvKSwgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfZnJhY3Rpb25fbW9kZXJuIDwtIGNhbGNfZm0oZGYkZDE0YywgMjAwOSkKICByZXR1cm4oZGF0YS5mcmFtZShkZikpCn0pCgojIDIwMDkgYnVsayBDIGRhdGEKcmFzMTguYmxrQyA8LSBhcy5kYXRhLmZyYW1lKHJlYWRfZXhjZWwoCiAgIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19zdW0vc2llcnJhX2RhdGFfc3VtbWFyeV8yMDIwLnhsc3giLAogIHNoZWV0ID0gIjIwMDlfYnVsa19kYXRhIikpCgojIEFkZCBQTSwgRUNPLCBtYXNzX2tnbTIgdmFycwpyYXMxOC5ibGtDJEVDTyA8LSBpZmVsc2UocmFzMTguYmxrQyRCaW9tZSA9PSAiUFAiLCAicHAiLCBpZmVsc2UocmFzMTguYmxrQyRCaW9tZSA9PSAiUkYiLCAicmYiLCAid2YiKSkKcmFzMTguYmxrQyRQTWVjbyA8LSBwYXN0ZTAocmFzMTguYmxrQyRQTSwgcmFzMTguYmxrQyRFQ08pCnJhczE4LmJsa0MkbWFzc19rZ20yIDwtIHJhczE4LmJsa0MkVGhpY2tuZXNzX2NtICogcmFzMTguYmxrQyRCRF9nX2NtXzMgKiByYXMxOC5ibGtDJFNvaWxfZmluZWZyYWN0aW9uICogMTAKCiMgQ2FsY3VsYXRlIFNPQyBzdG9ja3MKcmFzMTguYmxrQyRseXJfc29jIDwtIHJhczE4LmJsa0MkVGhpY2tuZXNzX2NtICogcmFzMTguYmxrQyRCRF9nX2NtXzMgKiByYXMxOC5ibGtDJFNvaWxfZmluZWZyYWN0aW9uICogcmFzMTguYmxrQyRDX3BjdCAqIDEwXi0xCgojIENhbGN1bGF0ZSBjbXR2IFNPQyBzdG9ja3MKcmFzMTguYmxrQyRseXJfc29jX2NtdHYgPC0gdW5saXN0KGxhcHBseShzcGxpdChyYXMxOC5ibGtDLCByYXMxOC5ibGtDJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgZm9yIChpIGluIHNlcShucm93KHgpKSkgewogICAgaWYgKGkgPT0gMSkgewogICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0KICAgIH0gZWxzZSB7CiAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY1tpXSArIHgkbHlyX3NvY19jbXR2W2kgLSAxXQogICAgfQogIH0KICByZXR1cm4oeCRseXJfc29jX2NtdHYpCn0pKQpgYGAKCmBgYHtyIGVycm9yLUJELXByZWR9CiMgTE9PQ1YgZnVuY3Rpb24sIGZpdCA9IGxtIG1vZApsb29jdiA8LSBmdW5jdGlvbiAoZml0KSB7CiAgaCA8LSBsbS5pbmZsdWVuY2UoZml0KSRoCiAgbWVhbigocmVzaWR1YWxzKGZpdCkgLyAoMS1oKSleMikKfQoKIyB0ZXN0IGZ1bmN0aW9uIGZvciBwcmVkaWN0aW5nIEJEIGFzIGZ1bmN0aW9uIG9mIFBNLCBFQ08sIGFuZCBDIGNvbnRlbnQKYmQubW9kIDwtIGxtKEJEX2dfY21fMyB+IFBNICogRUNPICsgUE0gKiBDX3BjdCArIGBib3R0b20gbWluZXJhbGAsIHJhczE4LmJsa0MpCmJkLnByZWQgPC0gcHJlZGljdC5sbShiZC5tb2QsIHJhczE4LmJsa0MsIGludGVydmFsID0gInByZWRpY3QiLCBwcmVkLnZhciA9IGxvb2N2KGJkLm1vZCkpCmJkLmVyci5kZiA8LSByYXMxOC5ibGtDCmJkLmVyci5kZiRCRF9wcmVkIDwtIGJkLnByZWRbICwgMV0KYmQuZXJyLmRmJEJEX2wgPC0gYmQucHJlZFsgLCAyXQpiZC5lcnIuZGYkQkRfdSA8LSBiZC5wcmVkWyAsIDNdCgojIHBsb3QKZ2dwbG90KGJkLmVyci5kZiwgYWVzKEJEX2dfY21fMywgQkRfcHJlZCkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IEJEX2wsIHltYXggPSBCRF91KSwgZmlsbCA9ICJsaWdodGdyYXkiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFBNLCBzaGFwZSA9IEVDTywgc2l6ZSA9IGBib3R0b20gbWluZXJhbGAvMTApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIHBsb3QtMjAwOS0xNGMtcHJvZmlsZXN9CiMgcGxvdAoKc3JhLjA5LnN1bSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IFBNZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwOSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMCwgMTgwKSkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiZWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAyKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBQcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBQcm9maWxlICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDA5LiBTb2xpZCB2ZXJ0aWNhbCBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUgaW4gdGhlIHllYXIgb2Ygc2FtcGxpbmcuIEVycm9yIGJhcnMgbm90IHNob3duIGFzIG9ubHkgYSBzaW5nbGUgcmVwbGljYXRlIHByb2ZpbGUgd2FzIGFuYWx5emVkIHBlciBzaXRlLgoKIyMgMjAxOSBtZWFuIHJhZGlvY2FyYm9uIHByb2ZpbGVzCmBgYHtyIHBsb3QtMjAxOS1hdmctcHJvZmlsZXN9CiMgY29tYmluZSByZXBzCnNyYS4yMDE5LnN1bS5scyAgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGRmIDwtIGRhdGEuZnJhbWUoZGYgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShseXJfdG9wX2NoID0gYXMuY2hhcmFjdGVyKGx5cl90b3ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdF9jaCA9IGFzLmNoYXJhY3RlcihseXJfYm90KSkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChQTSwgRUNPLCBQTWVjbywgZm0sIGQxNGMsIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBncm91cF9ieShQTSwgRUNPLCBQTWVjbywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkpCiAgbmFtZXMoZGYpIDwtIGMoIlBNIiwgIkVDTyIsICJQTWVjbyIsICJseXJfdG9wIiwgImx5cl9ib3QiLCAiZm0iLCAiZDE0YyIsICJmbV9zZCIsICJkMTRjX3NkIikKICBkZiRseXJfdG9wIDwtIGFzLm51bWVyaWMoZGYkbHlyX3RvcCkKICBkZiRseXJfYm90IDwtIGFzLm51bWVyaWMoZGYkbHlyX2JvdCkKICBkZiRkMTRjX3UgPC0gZGYkZDE0YyArIGRmJGQxNGNfc2QKICBkZiRkMTRjX2wgPC0gZGYkZDE0YyAtIGRmJGQxNGNfc2QKICByZXR1cm4oZGYpCn0pCnNyYS4xOS5zdW0gPC0gYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykgJT4lCiAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAKCiMgcGxvdAogCnNyYS4xOS5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgZ3JvdXAgPSBQTWVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMi43KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMobWF4KHNyYS4xOS5zdW0kbHlyX2JvdCksIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluKHNyYS4xOS5zdW0kZDE0YyksIDE4MCkpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gImVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMTkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbiwgc29saWQgdmVydGljYWwgbGluZSBzaG93cyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIHRoZSB5ZWFyIG9mIHNhbXBsaW5nLgoKIyMgQ2hhbmdlIGluICRcRGVsdGEkXjE0XkMgb3ZlciB0aW1lIGJldHdlZW4gMjAwMSBhbmQgMjAxOSAKCmBgYHtyIHBsb3QtYWxsLWF2Z30KIyBjb21iaW5lICcwMSBhbmQgJzE5IGRhdGEgZm9yIHBsb3R0aW5nCnNyYS4wMS5zdW0kWWVhciA8LSAyMDAxCnNyYS4xOS5zdW0kWWVhciA8LSAyMDE5CgpzcmEuMDEuMTkuc3VtIDwtIHJiaW5kKHNyYS4wMS5zdW0sIHNyYS4xOS5zdW0pCnNyYS4wMS4xOS5zdW0kWWVhciA8LSBhcy5mYWN0b3Ioc3JhLjAxLjE5LnN1bSRZZWFyKQoKIApzcmEuMDEuMTkuc3VtICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChFQ08sIFllYXIpLAogICAgICAgICBlY29ZZWFyMiA9IGlmZWxzZShlY29ZZWFyID09ICJwcDIwMDEiLCAid2FybSAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicHAyMDE5IiwgIndhcm0gKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMDEiLCAiY29vbCAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMTkiLCAiY29vbCAoMjAxOSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicmYyMDAxIiwgImNvbGQgKDIwMDEpIiwgImNvbGQgKDIwMTkpIikpKSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhcjIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDAxKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMDEpIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKDIwMTkpIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxIGFuZCAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbi4gVmVydGljYWwgbGluZXMgc2hvdyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIDIwMDEgKHNvbGlkKSBhbmQgMjAxOSAoZGFzaGVkKS4KCiMjIEluY3ViYXRpb24gJFxEZWx0YSReMTReQy1DT34yfgoKYGBge3IgaW5jLWQxNGMtcGxvdC1zZXR1cH0KIyMgMjAxOQpzcmEuMjAxOS5pbmMuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmluYy5scykKIyBhZGQgbGl0dGVyIGluYyBkYXRhIGFuZCBzdW1tYXJpemUKc3JhLjIwMTkuaW5jLnN1bS5kZiA8LSBkYXRhLmZyYW1lKHJiaW5kKAogIHNyYS4yMDE5LmluY19MLnN1bSwKICBzcmEuMjAxOS5pbmMuZGYgJT4lCiAgICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgIHBtID0gZmFjdG9yKGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSwKICAgICAgICAgICAjIHJlbW92ZSBHUnJmIDEwLTIwICJhIiBwb2ludAogICAgICAgICAgIGQxNGMgPSByZXBsYWNlKGQxNGMsIHdoaWNoKGQxNGMgPCAtMzAwKSwgTkEpLAogICAgICAgICAgIFllYXIgPSBmYWN0b3IoWWVhcikpICU+JQogIGdyb3VwX2J5KFllYXIsIFBNZWNvLCBwbSwgZWNvLCBseXJfYm90LCBseXJfdG9wKSAlPiUKICBzdW1tYXJpemUoZDE0Y19tZWFuID0gbWVhbihkMTRjLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBkMTRjX2wgPSBtaW4oZDE0YywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZDE0Y191ID0gbWF4KGQxNGMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGZtX21lYW4gPSBtZWFuKGZtKSwKICAgICAgICAgICAgZm1fbCA9IG1pbihmbSksCiAgICAgICAgICAgIGZtX3UgPSBtYXgoZm0pKSkpCnNyYS4yMDE5LmluYy5zdW0ubHMgPC0gc3BsaXQoc3JhLjIwMTkuaW5jLnN1bS5kZiwgc3JhLjIwMTkuaW5jLnN1bS5kZiRQTWVjbykKCiMgMjAwMQpzcmEuMjAwMS5pbmMuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDAxLmluYy5scykKc3JhLjIwMDEuaW5jLnN1bS5kZiA8LSBkYXRhLmZyYW1lKAogIHNyYS4yMDAxLmluYy5kZiAlPiUKICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgIHBtID0gZmFjdG9yKGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICAgIFllYXIgPSBmYWN0b3IoWWVhcikpICU+JQogICAgZ3JvdXBfYnkoWWVhciwgUE1lY28sIHBtLCBlY28sIGx5cl9ib3QsIGx5cl90b3ApICU+JQogICAgc3VtbWFyaXplKGQxNGNfbWVhbiA9IG1lYW4oZDE0YyksCiAgICAgICAgICAgICAgZDE0Y19sID0gbWluKGQxNGMpLAogICAgICAgICAgICAgIGQxNGNfdSA9IG1heChkMTRjKSwKICAgICAgICAgICAgICBmbV9tZWFuID0gbWVhbihmbSksCiAgICAgICAgICAgICAgZm1fbCA9IG1pbihmbSksCiAgICAgICAgICAgICAgZm1fdSA9IG1heChmbSkpCikKc3JhLjIwMDEuaW5jLnN1bS5scyA8LSBzcGxpdChzcmEuMjAwMS5pbmMuc3VtLmRmLCBzcmEuMjAwMS5pbmMuc3VtLmRmJFBNZWNvKQpzcmEuMjAwMS5pbmMuc3VtLmRmIDwtIHNyYS4yMDAxLmluYy5zdW0uZGZbICwgIShuYW1lcyhzcmEuMjAwMS5pbmMuc3VtLmRmKSAlaW4lIGMoImZtX21lYW4iLCAiZm1fbCIsICJmbV91IiwgImx5cl90b3AiLCAiUE1lY28iKSldCmBgYAoKYGBge3IgcGxvdC1pbmMtZDE0Yy0yMDE5fQojIDIwMTkKIApzcmEuMjAxOS5pbmMuc3VtLmRmW29yZGVyKHNyYS4yMDE5LmluYy5zdW0uZGYkbHlyX2JvdCksIF0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gJFxEZWx0YSReMTReQy1DT34yfiBvZiAyMDE5IGJ1bGsgc29pbCBpbmN1YmF0aW9ucyoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIE9uZSByZXAgZnJvbSBHUnJmIDEwLTIwICh0aGUgMTAtMjAgY20gaW5jcmVtZW50IHNhbXBsZSBmcm9tIHRoZSBjb2xkIGdyYW5pdGUgc2l0ZSkgaXMgc3Ryb25nbHkgZGVwbGV0ZWQgcmVsYXRpdmUgdG8gdGhlIG90aGVyIHJlcDogJFxEZWx0YSReMTReQy1DT34yfiA9IGByIHtzcmEuMjAxOS5pbmMuZGZbc3JhLjIwMTkuaW5jLmRmJFBNZWNvID09ICJHUnJmIiAmIHNyYS4yMDE5LmluYy5kZiRseXJfYm90ID09IDIwLCAiZDE0YyJdfWAuIFRoZSBoaWdobHkgZGVwbGV0ZWQgc2FtcGxlIGhhcyBiZWVuIGV4Y2x1ZGVkIGZvciBkaXNwbGF5IHJlYXNvbnMuCgpgYGB7ciBwbG90LWluYy1kMTRjLTIwMDF9CiMgcGxvdCAyMDAxIGRhdGEKIApzcmEuMjAwMS5pbmMuc3VtLmRmICU+JQogIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMS4gTm90ZSB0aGF0IHNvbWUgc2l0ZXMgb25seSBoYXZlIHR3byBkZXB0aCBpbmNyZW1lbnRzLiBTaW1pbGFyIHRvIHRoZSAyMDE5IGRhdGFzZXQsIG9uZSBvZiB0aGUgR1JyZiByZXBzIGZyb20gdGhlIGRlZXBlc3QgZGVwdGggaW5jcmVtZW50IHdhcyBzdHJvbmdseSBkZXBsZXRlZDogJFxEZWx0YSReMTReQy1DT34yfiA9IGByIHtzcmEuMjAwMS5pbmMuc3VtLmRmICU+JSBmaWx0ZXIocG0gPT0gImdyYW5pdGUiLCBlY28gPT0gImNvbGQiLCBseXJfYm90ID09IDI3KSAlPiUgcHVsbCgiZDE0Y19sIiwgImQxNGNfdSIpfWAuIEJvdGggcG9pbnRzIGhhdmUgYmVlbiBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zLgoKYGBge3IgcGxvdC1pbmMtZDE0Yy1hbGx9CiMgcGxvdCB0b2dldGhlcgpzcmEuaW5jLmFsbCA8LSByYmluZChzcmEuMjAwMS5pbmMuc3VtLmRmLCAKICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLnN1bS5kZlsgLCBuYW1lcyhzcmEuMjAxOS5pbmMuc3VtLmRmKSAlaW4lIG5hbWVzKHNyYS4yMDAxLmluYy5zdW0uZGYpXSkKc2F2ZShzcmEuaW5jLmFsbCwgZmlsZSA9ICJzcmEuaW5jLmFsbC5SRGF0YSIpCgogIApzcmEuaW5jLmFsbCAlPiUKICBmaWx0ZXIobHlyX2JvdCA+IDApICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKHBtLCBlY28sIFllYXIpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhcikpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYyg0MSwgMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03MCwgMTkwKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMDEgYW5kIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwMSBhbmQgMjAxOS4gRGlmZmVyZW50IGRlcHRoIGluY3JlbWVudHMgd2VyZSBzYW1wbGVkIGluIDIwMDEgYW5kIDIwMTkuIFBvaW50cyBhcmUgdGhlIG1lYW4gb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzOyBlcnJvciBiYXJzIGFyZSB0aGUgbWVhc3VyZWQgdmFsdWVzIG9mIGVhY2ggZHVwbGljYXRlLiBHcmFuaXRlL2NvbGQgcG9pbnQgZXhsY3VkZWQgZm9yIGRpc3BsYXkgcmVhc29ucyBhcyBpdCBpcyBzdHJvbmdseSBkZXBsZXRlZC4KCiMjIEluY3ViYXRpb24gdnMuIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DCgpgYGB7ciBpbmMtYnVsay1kMTRjLXBsb3Qtc2V0dXB9CiMgYmluZCByb3dzIG9mIGluYyBsaXN0CnNyYS4xOS5pbmMgPC0gc3JhLjIwMTkuaW5jLnN1bS5kZgpzcmEuMTkuaW5jJFR5cGUgPC0gImluYyIKCiMgMjAwMQpzcmEuMDEuaW5jIDwtIHNyYS4yMDAxLmluYy5zdW0uZGYKc3JhLjAxLmluYyRUeXBlIDwtICJpbmMiCgojIHJiaW5kIGJ1bGsgZGF0YQpzcmEuMTkuYnVsayA8LSBzcmEuMTkuc3VtW3doaWNoKHNyYS4xOS5zdW0kbHlyX2JvdCA8IDMxKSwgYygiWWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIsImQxNGMiLCAiZDE0Y19sIiwgImQxNGNfdSIpXQpuYW1lcyhzcmEuMTkuYnVsaylbd2hpY2gobmFtZXMoc3JhLjE5LmJ1bGspID09ICJkMTRjIildIDwtICJkMTRjX21lYW4iCnNyYS4xOS5idWxrJFR5cGUgPC0gImJ1bGsiCnNyYS4xOS5idWxrIDwtIHNyYS4xOS5idWxrICU+JQogIG11dGF0ZShwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIFBNID0gTlVMTCwKICAgICAgICAgRUNPID0gTlVMTCkKc3JhLjE5LmluYy5ibGsgPC0gcmJpbmQoc3JhLjE5LmJ1bGssIHNyYS4xOS5pbmNbICwgbmFtZXMoc3JhLjE5LmluYykgJWluJSBuYW1lcyhzcmEuMTkuYnVsayldKQpzYXZlKHNyYS4xOS5pbmMuYmxrLCBmaWxlID0gInNyYS4xOS5pbmMuYmxrLlJEYXRhIikKCiMgMjAwMQojIE5lZWQgdG8gY2FsY3VsYXRlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgcmFkaW9jYXJib24gdmFsdWVzIGFuZCBzdG9ja3MgZm9yIGNvbWJpbmVkIGluYyBkZXB0aHMgCiMgMSkgYWRkIFNPQyBzdG9ja3MgdG8gZHVwbGljYXRlIHNyYS4yMDAxLmxzIG9iagpzcmEuMjAwMS5sczIgPC0gc3JhLjIwMDEubHMKZm9yKGkgaW4gc2VxX2Fsb25nKHNyYS4yMDAxLmxzMikpIHsKICBpeCA8LSBtYXRjaChzcmEuMjAwMS5sczJbW2ldXVtbIklEIl1dLCBzb2MuMjAwMS5sc1tbaV1dW1siSUQiXV0pCiAgc3JhLjIwMDEubHMyW1tpXV1bImx5cl9zb2Nfa2dtMiJdIDwtIHNvYy4yMDAxLmxzW1tpXV1baXgsICJseXJfc29jX2tnbTIiXQp9CiMgMikgd2VpZ2h0ZWQgYXZlcmFnZSBmeApkMWQyLjE0Yy5meCA8LSBmdW5jdGlvbihkZikgewogIHN1bV9zb2MgPC0gc3VtKGRmWzE6MiwgImx5cl9zb2Nfa2dtMiJdKQogIHd0MSA8LSBkZiRseXJfc29jX2tnbTJbMV0gLyBzdW1fc29jCiAgd3QyIDwtIGRmJGx5cl9zb2Nfa2dtMlsyXSAvIHN1bV9zb2MKICBkMWQyIDwtIGRmWzEsIF0KICBkMWQyJElEID0gcGFzdGUoZGYkUE1lY29bMV0sIGRmJHByb19yZXBbMV0sIGRmJGx5cl90b3BbMV0sIGRmJGx5cl9ib3RbMl0sIHNlcCA9ICJfIikKICBkMWQyJGx5cl9zb2Nfa2dtMiA9IHN1bShkZiRseXJfc29jX2tnbTJbMV0sIGRmJGx5cl9zb2Nfa2dtMlsyXSkKICBkMWQyJGx5cl9ib3QgPSBkZiRseXJfYm90WzJdCiAgZDFkMiRmbSA8LSBzdW0oZGYkZm1bMV0gKiB3dDEsIGRmJGZtWzJdICogd3QyKQogIGQxZDIkZDE0YyA8LSBzdW0oZGYkZDE0Y1sxXSAqIHd0MSwgZGYkZDE0Y1syXSAqIHd0MikKICByZXR1cm4ocmJpbmQoZDFkMiwKICAgICAgICAgICAgICAgZGZbMzpucm93KGRmKSwgXSkpCn0KIyAzKSBjYWxjLiB3dGQuIGF2ZXJhZ2UgZm9yIEdScmYKc3JhLjIwMDEubHMyJEdScmYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMjAwMS5sczIkR1JyZiwgc3JhLjIwMDEubHMyJEdScmYkcHJvX3JlcCksIGZ1bmN0aW9uKHgpIHsKICAgIGQxZDIuMTRjLmZ4KHgpCiAgfSkKKQojIDQpIGNhbGMuIHd0ZC4gYXZlcmFnZSBmb3IgQlNyZgojICAgIC0gcHJvYmxlbSBoZXJlIGlzIHRoYXQgb25seSBvbmUgcHJvX3JlcCBoYXMgMC0zIGNtIGRhdGEKIyAgICAtIHNvLCBuZWVkIHRvIGNhbGN1bGF0ZSB3ZWlnaHRlZCBTT0MsIHRoZW4gY2FsY3VsYXRlIHdlaWdodGVkIDE0QwojICAgIC0gY29tcG9zaXRlIDAtOCA9IDE1ZyBCU3JmXzFfMC0zICsgNSBnIGZyb20gZWFjaCBwcm9fcmVwIEJTcmZfMy04CkJTcmZfY29tcF8wMV9pIDwtIHNyYS4yMDAxLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLmxzMiRCU3JmJGx5cl9ib3QgPCA5KSwgXQpCU3JmX2NvbXBfMDFfaSRzb2Nfd3QgPC0gYygxNSAvIDMwLCByZXAoNSAvIDMwLCAzKSkKQlNyZl9jb21wXzAxX2kkc29jX3d0ZCA8LSBCU3JmX2NvbXBfMDFfaSRseXJfc29jX2tnbTIgKiBCU3JmX2NvbXBfMDFfaSRzb2Nfd3QKCiMgY3JlYXRlIHN1bW1hcml6ZWQgbGlzdApzcmEuMjAwMS5zdW0ubHMyICA8LSBsYXBwbHkoc3JhLjIwMDEubHMyLCBmdW5jdGlvbihkZikgewogIGRhdGEuZnJhbWUoCiAgICBkZiAlPiUKICAgICAgZmlsdGVyKGx5cl9ib3QgPD0gNDApICU+JQogICAgICBtdXRhdGUobHlyX2JvdF9jaCA9IGFzLmNoYXJhY3RlcihseXJfYm90KSkgJT4lCiAgICAgIHNlbGVjdChQTWVjbywgZDE0YywgZm0sIGx5cl9ib3RfY2gsIGx5cl9zb2Nfa2dtMikgJT4lCiAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfYm90X2NoKSAlPiUKICAgICAgc3VtbWFyaXplKAogICAgICAgIGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkpICU+JQogICAgICBtdXRhdGUobHlyX2JvdCA9IGFzLm51bWVyaWMobHlyX2JvdF9jaCkpICU+JQogICAgICBzZWxlY3QoLWx5cl9ib3RfY2gpCiAgKQp9KQoKIyByZW1vdmUgQlNyZiByb3cgdy8gbHlyX2JvdCA9IDMKc3JhLjIwMDEuc3VtLmxzMiRCU3JmIDwtIHNyYS4yMDAxLnN1bS5sczIkQlNyZlstd2hpY2goc3JhLjIwMDEuc3VtLmxzMiRCU3JmJGx5cl9ib3QgPT0gMyksIF0KIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBmb3IgZDE0YywgZm0sIGx5cl9zb2Nfa2dtMgpzcmEuMjAwMS5zdW0ubHMyJEJTcmZbd2hpY2goc3JhLjIwMDEuc3VtLmxzMiRCU3JmJGx5cl9ib3QgPT0gOCksICJkMTRjX21lYW4iXSA8LSBzdW0oQlNyZl9jb21wXzAxX2kkZDE0YyAqIChCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkIC8gc3VtKEJTcmZfY29tcF8wMV9pJHNvY193dGQpKSkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCAiZm1fbWVhbiJdIDwtIHN1bShCU3JmX2NvbXBfMDFfaSRmbSAqIChCU3JmX2NvbXBfMDFfaSRzb2Nfd3RkIC8gc3VtKEJTcmZfY29tcF8wMV9pJHNvY193dGQpKSkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCAibHlyX3NvY19rZ20yX21lYW4iXSA8LSBzdW0oQlNyZl9jb21wXzAxX2kkc29jX3d0ZCkKc3JhLjIwMDEuc3VtLmxzMiRCU3JmW3doaWNoKHNyYS4yMDAxLnN1bS5sczIkQlNyZiRseXJfYm90ID09IDgpLCBjKCJkMTRjX3NkIiwgImZtX3NkIiwgImx5cl9zb2Nfa2dtMl9zZCIpXSA8LSBOQQoKIyBjYWxjdWxhdGUgY210diBzb2MKc3JhLjIwMDEuc3VtLmxzMiA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzMiwgZnVuY3Rpb24oeCkgewogIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdCiAgeCRseXJfc29jX2NtdHYgPC0gTkEKICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMl9tZWFuW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJfbWVhbltpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgIH0KICB9CiAgcmV0dXJuKHgpCn0pCgojIG1ha2UgZGYKc3JhLjAxLnN1bSA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzMiwgZnVuY3Rpb24oZGYpIHsKICAgIGRmICU+JQogICAgICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShncmVwbCgicHAiLCBkZiRQTWVjbyksICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIGRmJFBNZWNvKSwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgIHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIGRmJFBNZWNvKSwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBkZiRQTWVjbyksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWVhbiArIGQxNGNfc2QsCiAgICAgICAgICAgICBkMTRjX2wgPSBkMTRjX21lYW4gLSBkMTRjX3NkLAogICAgICAgICAgICAgWWVhciA9IDIwMDEsCiAgICAgICAgICAgICBUeXBlID0gImJ1bGsiKSAlPiUKICAgICAgc2VsZWN0KG5hbWVzKHNyYS4wMS5pbmMpKSAlPiUKICAgICAgYXJyYW5nZShseXJfYm90KQogIH0pCikpCiMgYmluZCB3aXRoIGluYwpzcmEuMDEuaW5jLmJsayA8LSByYmluZChkYXRhLmZyYW1lKHNyYS4wMS5pbmMpLCBzcmEuMDEuc3VtKQpzYXZlKHNyYS4wMS5pbmMuYmxrLCBmaWxlID0gInNyYS4wMS5pbmMuYmxrLlJEYXRhIikKYGBgCgpgYGB7ciByZWFkLXJlc3AtdHN9CiMjIHJlYWQgaW4gdGltZXNlcmllcyBvZiBDTzIgcmVsZWFzZSBmcm9tIGluY3ViYXRpb25zCiMgMjAxOQpzcmEuMTlhLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWFfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQpzcmEuMTliLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MxOWJfQ08yX2ZsdXhfMjAyMS0wMS0xOS5jc3YiKQoKIyAyMDAxCnNyYS4wMS4xLmNvMi50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2xhYl9qZW5hX0NPMi10aW1lc2VyaWVzL1MwMV8xX0NPMl9mbHV4XzIwMjEtMDEtMjcuY3N2IikKc3JhLjAxLjIuY28yLnRzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvbGFiX2plbmFfQ08yLXRpbWVzZXJpZXMvUzAxXzJfQ08yX2ZsdXhfMjAyMS0wMS0yNy5jc3YiKQoKIyMgVGVzdCB0aGF0IHJlcXVpcmVkIG5hbWVzIGFyZSBwcmVzZW50Cm5tcyA8LSBjKCJQTWVjbyIsICJJRCIsICJkd19nIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAibWdDTzJfamFyIikKaW52aXNpYmxlKGxhcHBseShsaXN0KHNyYS4xOWEuY28yLnRzLAogICAgICAgICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHMsCiAgICAgICAgICAgICAgICAgICAgICBzcmEuMDEuMi5jbzIudHMpLAogICAgICAgZnVuY3Rpb24oeCkgewogICAgICAgICBpZmVsc2UoIWlzLm5hKG1hdGNoKG5tcywgbmFtZXMoeCkpKSwgInllcyIsICJubyIpCiAgICAgICB9CiAgICAgICApKQoKIyBjb21iaW5lIGFsbCBkYXRhLCByZW1vdmUgdGltZSBwb2ludHMgd2l0aG91dCBDTzIgbWVhc3VyZW1lbnRzLCBhbmQgYWRkIHllYXIgYW5kIHJlcCAKdHMgPC0gYmluZF9yb3dzKHNyYS4xOWEuY28yLnRzWyAsIG5tc10sIAogICAgICAgICAgICAgICAgc3JhLjE5Yi5jbzIudHNbICwgbm1zXSwgCiAgICAgICAgICAgICAgICBzcmEuMDEuMS5jbzIudHNbICwgbm1zXSwKICAgICAgICAgICAgICAgIHNyYS4wMS4yLmNvMi50c1sgLCBubXNdKQppZihsZW5ndGgod2hpY2goaXMubmEodHMkbWdDTzJfamFyKSkpID4gMCkgewogIHRzIDwtIHRzWy13aGljaChpcy5uYSh0cyRtZ0NPMl9qYXIpKSwgXQp9CnRzJHllYXIgPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDMpCnRzJHJlcCA8LSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHRzJElEKSwgIl8iKSwgIltbIiwgNCkKdHMkZGVwdGggPC0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih0cyRJRCksICJfIiksICJbWyIsIDIpCnRzJElEMiA8LSBwYXN0ZSh0cyRQTWVjbywgdHMkZGVwdGgsIHNlcCA9ICJfIikKCiMgYWRkIEMgY29udGVudAp0c1t3aGljaCh0cyR5ZWFyID09IDIwMDEpLCAiZ0NfZ1MiXSA8LSBhcy5udW1lcmljKHNvYy4yMDAxLnN1bTJbbWF0Y2godHNbd2hpY2godHMkeWVhciA9PSAyMDAxKSwgIklEMiJdLCBzb2MuMjAwMS5zdW0yJElEMiksICJjX3BjdF9hdmciXSkgKiAxMF4tMgp0c1t3aGljaCh0cyR5ZWFyID09IDIwMTkpLCAiZ0NfZ1MiXSA8LSBzcmEuMjAxOS5jbi5zdW1bbWF0Y2godHNbd2hpY2godHMkeWVhciA9PSAyMDE5KSwgIklEMiJdLCBzcmEuMjAxOS5jbi5zdW0kSUQyKSwgImNfcGN0X2F2ZyJdICogMTBeLTIKCiMgY2FsY3VsYXRlIHBlciB1bml0IGNhcmJvbiBmbHV4ZXMKdHMkbWdDTzJfZ0MgPC0gdHMkZ0NfZ1MgKiB0cyRkd19nICogdHMkbWdDTzJfamFyICogKDEyLzQ0KQp0cyRtZ0NPMl9nQ19kIDwtIHRzJG1nQ08yX2dDIC8gdHMkdGltZV9kCgojIGF2ZXJhZ2UgZmx1eGVzIGJ5IHJlcAp0cy5yZXAuYXZnIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3BsaXQodHMsIHRzJElEKSwgZnVuY3Rpb24oeCkgewogICAgeCAlPiUKICAgICAgZ3JvdXBfYnkoUE1lY28sIHllYXIsIGRlcHRoLCByZXApICU+JQogICAgICBzdW1tYXJpemUodGltZV9kID0gbWF4KHRpbWVfZCksCiAgICAgICAgICAgICAgICBtZ0NPMl9nQ19kX2F2ZyA9IG1lYW4obWdDTzJfZ0NfZCksCiAgICAgICAgICAgICAgICBtZ0NPMl9nQ19kX21heCA9IG1heChtZ0NPMl9nQ19kKSwKICAgICAgICAgICAgICAgIG1nQ08yX2dDX2RfbWluID0gbWluKG1nQ08yX2dDX2QpLAogICAgICAgICAgICAgICAgbWdDTzJfZ0NfYXZnID0gbWVhbihtZ0NPMl9nQyksCiAgICAgICAgICAgICAgICBtZ0NPMl9nQ19tYXggPSBtYXgobWdDTzJfZ0MpLAogICAgICAgICAgICAgICAgbWdDTzJfZ0NfbWluID0gbWluKG1nQ08yX2dDKSkgJT4lCiAgICAgIG11dGF0ZShQTWVjb19kZXB0aF95ZWFyID0gcGFzdGUoUE1lY28sIGRlcHRoLCB5ZWFyLCBzZXAgPSAiXyIpLAogICAgICAgICAgICAgbHlyX3RvcCA9IGFzLm51bWVyaWMoc2FwcGx5KHN0cnNwbGl0KGRlcHRoLCAiLSIpLCAiWyIsIDEpKSwKICAgICAgICAgICAgIGx5cl9ib3QgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIi0iKSwgIlsiLCAyKSkpCiAgfSksIC5pZCA9ICJJRCIpICU+JQogIG11dGF0ZShQTWVjb195ZWFyX3JlcCA9IHBhc3RlKFBNZWNvLCB5ZWFyLCByZXAsIHNlcCA9ICJfIikpCgojIGF2ZXJhZ2UgcmVwcwp0cy5hdmcgPC0gdHMgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIHllYXIsIGRlcHRoLCB0aW1lcG9pbnRfY210dikgJT4lCiAgc3VtbWFyaXplKHRpbWVfZCA9IG1lYW4odGltZV9kKSwKICAgICAgICAgICAgbWdDTzJfZ0NfZF9hdmcgPSBtZWFuKG1nQ08yX2dDX2QpLAogICAgICAgICAgICBtZ0NPMl9nQ19kX21heCA9IG1heChtZ0NPMl9nQ19kKSwKICAgICAgICAgICAgbWdDTzJfZ0NfZF9taW4gPSBtaW4obWdDTzJfZ0NfZCksCiAgICAgICAgICAgIG1nQ08yX2dDX2F2ZyA9IG1lYW4obWdDTzJfZ0MpLAogICAgICAgICAgICBtZ0NPMl9nQ19tYXggPSBtYXgobWdDTzJfZ0MpLAogICAgICAgICAgICBtZ0NPMl9nQ19taW4gPSBtaW4obWdDTzJfZ0MpKSAlPiUKICBtdXRhdGUoUE1lY29fZGVwdGhfeWVhciA9IHBhc3RlKFBNZWNvLCBkZXB0aCwgeWVhciwgc2VwID0gIl8iKSkKCiMgYWRkIGRlcHRoIGluZGV4CnQxIDwtIHRzLmF2Z1t0cy5hdmckdGltZXBvaW50X2NtdHYgPT0gMSwgXQp0MSA8LSBkYXRhLmZyYW1lKAogIGJpbmRfcm93cygKICAgIGxhcHBseShzcGxpdCh0MSwgdDEkeWVhciksIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZGYsIGRmJFBNZWNvKSwgZnVuY3Rpb24oeCkgewogICAgICAgIHgkbHlyX3RvcCA8LSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdCh4JGRlcHRoLCAiLSIpLCAiWyIsIDEpKQogICAgICAgIHggPC0geFtvcmRlcih4JGx5cl90b3ApLCBdCiAgICAgICAgeCRkZXB0aF9pbmRleCA8LSBzZXEoMSwgbnJvdyh4KSkKICAgICAgICByZXR1cm4oeCkKICAgICAgfSkpCiAgICB9KSkpCnRzLmF2ZyRkZXB0aF9pbmRleCA8LSB0MVttYXRjaCh0cy5hdmckUE1lY29fZGVwdGhfeWVhciwgdDEkUE1lY29fZGVwdGhfeWVhciksICJkZXB0aF9pbmRleCJdCgojIGN1bXVsYXRpdmUgZmx1eCByYXRlcwp0cy5hdmcuY210diA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHRzLmF2ZywgdHMuYXZnJFBNZWNvX2RlcHRoX3llYXIpLCBmdW5jdGlvbih4KSB4W25yb3coeCksIF0pLCAKICAuaWQgPSAiUE1lY29fZGVwdGhfeWVhciIpCmBgYAoKYGBge3IgcGxvdC1yZXNwLXJhdGVzfQojIGZ1bmN0aW9uIGZvciBwbG90dGluZwp0cy5wbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCB5ciwgaW5jcmVtZW50LCBjdW11bGF0aXZlID0gVFJVRSkgewogICAgICBpZiAoY3VtdWxhdGl2ZSkgewogICAgICAgIGRmICU+JQogICAgICAgICAgZmlsdGVyKHllYXIgPT0geXIgJiBkZXB0aF9pbmRleCA9PSBpbmNyZW1lbnQpICU+JQogICAgICAgICAgbXV0YXRlKFBNID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvKSwgIkFOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY28pLCAiQlMiLCAiR1IiKSksCiAgICAgICAgICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShncmVwbCgicmYiLCBQTWVjbyksICJyZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvKSwgIndmIiwgInBwIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgICAgICAgICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZCwgbWdDTzJfZ0NfYXZnLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICAgICAgICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWdDTzJfZ0NfbWF4LCB5bWF4ID0gbWdDTzJfZ0NfbWluLCBmaWxsID0gUE0sIGxpbmV0eXBlID0gZWNvLCBhbHBoYSA9IDAuMiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfbWF4LCBmaWxsID0gUE0sIHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywgc3Ryb2tlID0gMSkgKwogICAgICAgICAgZ2VvbV9wb2ludChhZXModGltZV9kLCBtZ0NPMl9nQ19taW4sIGZpbGwgPSBQTSwgc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLCBzdHJva2UgPSAxKSArCiAgICAgICAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gUE0sIGxpbmV0eXBlID0gZWNvKSwgc2l6ZSA9IDEuMikgKwogICAgICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLAogICAgICAgICAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKGVjbyA9IGMoInJmIiA9ICJjb2xkIiwgIndmIiA9ICJjb29sIiwgInBwIiA9ICJ3YXJtIikpKSArCiAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDMwKSkgKwogICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInJmIiA9ICJjb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gIndhcm0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAyMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDI0KSkgKwogICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jKCJBTiIgPSAiYmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgICAgICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicmYiID0gImRvdHRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHAiID0gInNvbGlkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJjb29sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcCIgPSAid2FybSIpKSArCiAgICAgICAgICB5bGFiKGV4cHJlc3Npb24oJ0N1bXVsYXRpdmUgZmx1eCAobWdDTydbMl0qJy1DIGdDJ14tMSonKScpKSArCiAgICAgICAgICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICAgICAgICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLAogICAgICAgICAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMykpICsKICAgICAgICAgIGdndGl0bGUocGFzdGUoIkN1bXVsYXRpdmUgZmx1eCwgIiwgeXIsICJkZXB0aCAiLCBpbmNyZW1lbnQpKSArCiAgICAgICAgICB0aGVtZV9idygpICsKICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiAgICB9IGVsc2UgewogICAgICAgZGYgJT4lCiAgICAgICAgZmlsdGVyKHllYXIgPT0geXIgJiBkZXB0aF9pbmRleCA9PSBpbmNyZW1lbnQpICU+JQogICAgICAgIG11dGF0ZShQTSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJBTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjbyksICJCUyIsICJHUiIpKSwKICAgICAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCJyZiIsIFBNZWNvKSwgInJmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjbyksICJ3ZiIsICJwcCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogICAgICAgIGdncGxvdCguLCBhZXModGltZV9kLCBtZ0NPMl9nQ19kX2F2ZywgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgICAgICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZ0NPMl9nQ19kX21heCwgeW1heCA9IG1nQ08yX2dDX2RfbWluLCBmaWxsID0gUE0sIGxpbmV0eXBlID0gZWNvLCBhbHBoYSA9IDAuMiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHRpbWVfZCwgbWdDTzJfZ0NfZF9tYXgsIGZpbGwgPSBQTSwgc2hhcGUgPSBlY28pLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLCBzdHJva2UgPSAxKSArCiAgICAgICAgICBnZW9tX3BvaW50KGFlcyh0aW1lX2QsIG1nQ08yX2dDX2RfbWluLCBmaWxsID0gUE0sIHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywgc3Ryb2tlID0gMSkgKwogICAgICAgIGdlb21fbGluZShhZXMoY29sb3IgPSBQTSwgbGluZXR5cGUgPSBlY28pLCBzaXplID0gMS4yKSArCiAgICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLAogICAgICAgICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihlY28gPSBjKCJyZiIgPSAiY29sZCIsICJ3ZiIgPSAiY29vbCIsICJwcCIgPSAid2FybSIpKSkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMzApKSArCiAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJ3YXJtIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDIxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAyNCkpICsKICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPWMoIkFOIiA9ICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICAgICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicmYiID0gImRvdHRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcCIgPSAic29saWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicmYiID0gImNvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwIiA9ICJ3YXJtIikpICsKICAgICAgICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICAgICAgICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICAgICAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAxKSwKICAgICAgICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAzKSkgKwogICAgICAgIGdndGl0bGUocGFzdGUoIkZsdXggcmF0ZSIsIHlyLCAiZGVwdGggIiwgaW5jcmVtZW50KSkgKwogICAgICAgIHRoZW1lX2J3KCkgKwogICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiAgICB9Cn0KCiMjIGN1bXVsYXRpdmUgZmx1eAojIDIwMTkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMTkiLCBpbmNyZW1lbnQgPSAiMSIpCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDE5IiwgaW5jcmVtZW50ID0gIjIiKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIzIikKIyAyMDAxCnRzLnBsb3QuZngodHMuYXZnLCB5ciA9ICIyMDAxIiwgaW5jcmVtZW50ID0gIjEiKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAwMSIsIGluY3JlbWVudCA9ICIyIikKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMyIpCgojIyBmbHV4IHJhdGVzCiMgMjAxOQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIxIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIyIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQp0cy5wbG90LmZ4KHRzLmF2ZywgeXIgPSAiMjAxOSIsIGluY3JlbWVudCA9ICIzIiwgY3VtdWxhdGl2ZSA9IEZBTFNFKQojIDIwMDEKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMSIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMiIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKdHMucGxvdC5meCh0cy5hdmcsIHlyID0gIjIwMDEiLCBpbmNyZW1lbnQgPSAiMyIsIGN1bXVsYXRpdmUgPSBGQUxTRSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFJlc3BpcmF0aW9uIGRhdGEgZnJvbSBpbmN1YmF0aW9ucyBvZiAyMDE5IGFuZCAyMDAxIGJ1bGsgc29pbHMuICoqCgo+KkNhcHRpb246KiBQb2ludHMgc2hvdyBtZWFzdXJlZCBDT34yfiBwcm9kdWN0aW9uIG9mIGxhYm9yYXRvcnkgZHVwbGljYXRlcyBhcyBjdW11bGF0aXZlIGZsdXhlcyBvciBkYWlseSBmbHV4IHJhdGVzIGJ5IGRlcHRoLCBsaW5lcyBzaG93IHRoZSBtZWFucywgYW5kIHRoZSByaWJib24gcmVwcmVzZW50cyB0aGUgcmFuZ2UuIAoKYGBge3IgcGxvdC1pbmMtYmxrLTIwMTl9CiMgcGxvdCAyMDE5CiAKIyBwIDwtCnNyYS4xOS5pbmMuYmxrICU+JQogIG11dGF0ZShFQ090eXBlID0gcGFzdGUwKGVjbywgIiAoIiwgVHlwZSwgIikiKSkgJT4lCiAgYXJyYW5nZShseXJfYm90KSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbiwgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBFQ090eXBlLCBsaW5ldHlwZSA9IFR5cGUpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAodHlwZSkiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIChidWxrKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGJ1bGspIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoYnVsaykiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKGluYykiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGluYykiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKGluYykiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIGdnc2F2ZSgic3JhLmJ1bGtJbmMuMTkucGRmIiwgcCwgZGV2aWNlID0gY2Fpcm9fcGRmLCB3aWR0aCA9IDkuNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gJFxEZWx0YSReMTReQyBvZiAyMDE5IGJ1bGsgc29pbCBpbmN1YmF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBidWxrIHNvaWwqKgoKPipDYXB0aW9uOiogJFxEZWx0YSReMTReQyBvZiBidWxrIHNvaWwgYW5kIHJlc3BpcmVkIENPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIGJ1bGsgc29pbCwgcG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIGJ1bGsgc29pbHMgYW5kIHNpbmdsZSBvYnNlcnZhdGlvbnMgZm9yIHJlc3BpcmVkIENPfjJ+LiAKCmBgYHtyIHBsb3QtaW5jLWJsay0yMDAxfQojIHBsb3QgMjAwMQogCnNyYS4wMS5pbmMuYmxrICU+JQogIG11dGF0ZShFQ090eXBlID0gcGFzdGUwKGVjbywgIiAoIiwgVHlwZSwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gRUNPdHlwZSwgbGluZXR5cGUgPSBUeXBlKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAwMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0gKHR5cGUpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoYnVsaykiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIChidWxrKSIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKGJ1bGspIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtIChpbmMpIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIChpbmMpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChpbmMpIiA9IDIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMCwgMjAwKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiAkXERlbHRhJF4xNF5DIG9mIDIwMDEgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCoqCgo+KkNhcHRpb246KiAkXERlbHRhJF4xNF5DIG9mIGJ1bGsgc29pbCBhbmQgcmVzcGlyZWQgQ09+Mn4gYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxLiBQb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlcyBmb3IgYnVsayBzb2lscyBhbmQgbWVhbiBvZiBsYWJvcmF0b3J5IGR1cGxpY2F0ZXMgZm9yIHJlc3BpcmVkIENPfjJ+LiBUaGUgaW5jdWJhdGVkIHNvaWwgc2FtcGxlcyBhcmUgYSBjb21wb3NpdGUgbWFkZSBieSBob21vZ2VuaXppbmcgc3Vic2FtcGxlcyBmcm9tIGVhY2ggb2YgdGhlIHRocmVlIHJlcGxpY2F0ZSBwcm9maWxlIHNhbXBsZXMgYnkgZGVwdGguIEVycm9yIGJhcnMgc2hvdyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBidWxrIHNvaWwgYW5kIHRoZSBtZWFzdXJlZCB2YWx1ZXMgZnJvbSBsYWJvcmF0b3J5IGR1cGxpY2F0ZXMgb2YgdGhlIGluY3ViYXRlZCBjb21wb3NpdGUgc2FtcGxlcy4KCmBgYHtyIHByZXAtaW5jLWJ5LWJ1bGstMTRjLXBsb3R9CiMgZmlyc3QgbWVyZ2UgbWVhbiAxNEMgZGF0YSBmcm9tIDIwMTkgc2FtcGxlcyB3aXRoIGNvbXBvc2l0ZSBpbmN1YmF0aW9uIGRhdGEKbm1zLmluYy5ibGsgPC0gYygicG0iLCAiZWNvIiwgImx5cl9ib3QiLCAiWWVhciIpCnNyYS4xOS5pbmMuYmxrMiA8LSBsZWZ0X2pvaW4oc3JhLjE5LmJ1bGsgJT4lIG11dGF0ZSguLCBZZWFyID0gYXMuZmFjdG9yKFllYXIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEuMjAxOS5pbmMuc3VtLmRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbm1zLmluYy5ibGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiLmJ1bGsiLCAiLmluYyIpKQojIDIwMDEKc3JhLjAxLmluYy5ibGsyIDwtIGxlZnRfam9pbihzcmEuMDEuc3VtICU+JSBtdXRhdGUoLiwgWWVhciA9IGFzLmZhY3RvcihZZWFyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjAxLmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG5tcy5pbmMuYmxrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi5idWxrIiwgIi5pbmMiKSkKc3JhLjAxLmluYy5ibGsyJFBNZWNvIDwtIHBhc3RlMChzcmEuMDEuaW5jLmJsazIkcG0sIHNyYS4wMS5pbmMuYmxrMiRlY28pCiMgYWRkIGRlcHRoIGZhY3RvcgpzcmEuMDEuaW5jLmJsazIgPC0gdW5zcGxpdCgKICBsYXBwbHkoc3BsaXQoc3JhLjAxLmluYy5ibGsyLCBzcmEuMDEuaW5jLmJsazIkUE1lY28pLCBmdW5jdGlvbih4KSB7CiAgeCRkZXB0aCA8LSBzZXEoMSwgbnJvdyh4KSkKICByZXR1cm4oeCkgCiAgfSksIApzcmEuMDEuaW5jLmJsazIkUE1lY28pCnNyYS4wMS5pbmMuYmxrMiA8LSBzcmEuMDEuaW5jLmJsazJbd2hpY2goc3JhLjAxLmluYy5ibGsyJGx5cl9ib3QgPCAzNSksIF0Kc3JhLjAxLmluYy5ibGsyJGRlcHRoIDwtIGZhY3RvcihzcmEuMDEuaW5jLmJsazIkZGVwdGgpCgojIHJlZ3Jlc3MgYnVsayB2cy4gaW5jCm1pbi5pbmMuYmxrLjE5IDwtIG1pbihzcmEuMTkuaW5jLmJsazIkZDE0Y19sLmluYywKICAgICAgICAgICAgICAgICAgICAgIHNyYS4xOS5pbmMuYmxrMiRkMTRjX2wuYnVsaykgIyBleGNsdWRlIGhpZ2hseSBuZWdhdGl2ZSBpbmN1YmF0aW9uIHNhbXBsZSBmcm9tIEdSd2YKbWF4LmluYy5ibGsuMTkgPC0gbWF4KHNyYS4xOS5pbmMuYmxrMiRkMTRjX2wuaW5jLAogICAgICAgICAgICAgICAgICAgICAgc3JhLjE5LmluYy5ibGsyJGQxNGNfbC5idWxrKQoKIyBXaGF0IGlzIHRoZSBpZGVhbCBncm91cGluZy9leHBlY3RlZCByZWxhdGlvbnNoaXA/CmBgYAoKYGBge3IgcGxvdC1pbmMtYnktYnVsay0xNGN9CiMjIGxvb2sgYXQgY29tYmluYXRvcmlhbCBkYXRhc2V0CiMgc3JhLmFsbC5kZi5meCA8LSBmdW5jdGlvbihscywgeWVhcikgewojICAgY2JpbmQoYmluZF9yb3dzKGxhcHBseShscywgZnVuY3Rpb24oZGYpIGRmWyAsIGMoIlBNZWNvIiwgImx5cl9ib3QiLCAiZDE0YyIpXSkpLAojICAgICAgICAgeWVhciA9IHllYXIpCiMgfQojIHNyYS5hbGwuZGYgPC0gaW5uZXJfam9pbigKIyAgIHJiaW5kKHNyYS5hbGwuZGYuZngoc3JhLjIwMDEubHMsIDIwMDEpLAojICAgICAgICAgc3JhLmFsbC5kZi5meChzcmEuMjAxOS5scywgMjAxOSkpLAojICAgcmJpbmQoc3JhLmFsbC5kZi5meChzcmEuMjAwMS5pbmMubHMsIDIwMDEpLAojICAgICAgICAgc3JhLmFsbC5kZi5meChzcmEuMjAxOS5pbmMubHMsIDIwMTkpKSwKIyAgIGJ5ID0gYygiUE1lY28iLCAibHlyX2JvdCIsICJ5ZWFyIiksCiMgICBzdWZmaXggPSBjKCJfYnVsayIsICJfaW5jIikpCiMgc3JhLmFsbC5kZiA8LSBzcmEuYWxsLmRmICU+JQojICAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvLCAxLCAyKSwKIyAgICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpKQojIAojIHNyYS5hbGwuZGYgJT4lCiMgICBmaWx0ZXIoZDE0Y19pbmMgPiAtMTMwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19idWxrLCBkMTRjX2luYywgY29sb3IgPSBQTSkpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBhZXMoZmlsbCA9IFBNKSkgKwojICAgZ2VvbV9wb2ludCgpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwojICAgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwojICAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEzMCwgMjAwKSwgeWxpbSA9IGMoLTEzMCwgMjAwKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdCdWxrIHNvaWwgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgICAKIyBzdW1tYXJ5KGxtKGQxNGNfaW5jIH4gZDE0Y19idWxrICogUE0sIHNyYS5hbGwuZGZbc3JhLmFsbC5kZiRkMTRjX2luYyA+IC0xMzAsIF0pKQoKIyBqb2luIGFsbCBkYXRhIGFzIG1lYW5zIGFuZCBzZHMKc3JhLmFsbC5zdW0uZGYgPC0gbGVmdF9qb2luKAogIGJpbmRfcm93cyhzcmEuMjAwMS5zdW0ubHMyKSAlPiUKICAgIHNlbGVjdChQTWVjbywgbHlyX2JvdCwgZDE0Y19tZWFuLCBkMTRjX3NkKSAlPiUKICAgIG11dGF0ZShZZWFyID0gMjAwMSkgJT4lCiAgICBiaW5kX3Jvd3MoLiwgCiAgICAgICAgICAgICAgYmluZF9yb3dzKGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICAgICAgICAgICAgICAgIGRmICU+JQogICAgICAgICAgICAgICAgICBmaWx0ZXIobHlyX2JvdCA8IDMxKSAlPiUKICAgICAgICAgICAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfYm90LCBkMTRjKSAlPiUKICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE1lY28sIGx5cl9ib3QpICU+JQogICAgICAgICAgICAgICAgICBzdW1tYXJpemUoYWNyb3NzKGQxNGMsIGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgICAgICAgICAgICAgICAgIG11dGF0ZShZZWFyID0gMjAxOSkKICAgICAgICAgICAgICAgIH0pKQogICAgICAgICAgICApLAogIGJpbmRfcm93cyhsYXBwbHkoc3JhLjIwMDEuaW5jLmxzLCBmdW5jdGlvbihkZikgewogICAgICAgICAgICAgIGRmICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfYm90LCBkMTRjKSAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5KFBNZWNvLCBseXJfYm90KSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcml6ZShhY3Jvc3MoZDE0YywgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZShZZWFyID0gMjAwMSkgCiAgICAgICAgICAgICAgfSkpICU+JQogIGJpbmRfcm93cyguLCAKICAgICAgICAgICAgYmluZF9yb3dzKGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgICAgICAgZGYgJT4lCiAgICAgICAgICAgICAgICBzZWxlY3QoUE1lY28sIGx5cl9ib3QsIGQxNGMpICU+JQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE1lY28sIGx5cl9ib3QpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKGFjcm9zcyhkMTRjLCBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlKFllYXIgPSAyMDE5KQogICAgICAgICAgICAgIH0pKQogICAgICAgICAgICApLCAKICBieSA9IGMoIlBNZWNvIiwgImx5cl9ib3QiLCAiWWVhciIpLAogIHN1ZmZpeCA9IGMoIi5idWxrIiwgIi5pbmMiKSkgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyaW5nKFBNZWNvLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyaW5nKFBNZWNvLCAzLCA0KSkKCiMgVHJlbmQgZm9yIG1lYW5zCiMgTkIgWWVhciBvbmx5LCBkZXB0aCBvbmx5IG1vZGVscyBkbyBub3Qgc2hvdyBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMKIyBQTSBvbmx5IG1vZGVsCmVtdHJlbmRzKGxtKGQxNGNfbWVhbi5pbmMgfiBkMTRjX21lYW4uYnVsayAqIFBNLCBzcmEuYWxsLnN1bS5kZltzcmEuYWxsLnN1bS5kZiRkMTRjX21lYW4uaW5jID4gLTIwMCwgXSksIHBhaXJ3aXNlIH4gUE0sIHZhciA9ICJkMTRjX21lYW4uYnVsayIpCiMgRUNPIG9ubHkgbW9kZWwKZW10cmVuZHMobG0oZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrICogZWNvLCBzcmEuYWxsLnN1bS5kZltzcmEuYWxsLnN1bS5kZiRkMTRjX21lYW4uaW5jID4gLTIwMCwgXSksIHBhaXJ3aXNlIH4gZWNvLCB2YXIgPSAiZDE0Y19tZWFuLmJ1bGsiKQoKCiMgbGFwcGx5KHNwbGl0KHNyYS5hbGwuc3VtLmRmLCBzcmEuYWxsLnN1bS5kZiRlY28pLCBmdW5jdGlvbihkZikgewojICAgc3VtbWFyeShsbShkMTRjX21lYW4uaW5jIH4gZDE0Y19tZWFuLmJ1bGsgKiBQTSwgZGYpKQojIH0pCgojICMgRGVtaW5nIHJlZ3Jlc3Npb24gKGFjY291bnRzIGZvciBlcnJvciBpbiB4IGFuZCB5IHRlcm1zKQojIHNyYS5kZW0gPC0gbGFwcGx5KHNwbGl0KHNyYS5hbGwuc3VtLmRmLCBzcmEuYWxsLnN1bS5kZiRQTSksIGZ1bmN0aW9uKGRmKSB7CiMgICBkZW1pbmcoZDE0Y19tZWFuLmluYyB+IGQxNGNfbWVhbi5idWxrLAojICAgICAgICBkYXRhID0gZGYsIHhzdGQgPSBkMTRjX3NkLmluYywgeXN0ZCA9IGQxNGNfc2QuYnVsaykKIyB9KQoKIyBhbGwgZGVwdGhzIGFuZCB5ZWFycyB0b2dldGhlciwgYnkgUE0KIApzcmEuMTkuaW5jLmJsazIgICU+JQogIGJpbmRfcm93cyguLCBzcmEuMDEuaW5jLmJsazJbICwgd2hpY2gobmFtZXMoc3JhLjE5LmluYy5ibGsyKSAlaW4lIG5hbWVzKHNyYS4wMS5pbmMuYmxrMikpXSkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZmlsdGVyKGQxNGNfbWVhbi5pbmMgPiAtMjAwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbi5idWxrLCBkMTRjX21lYW4uaW5jLCBjb2xvciA9IHBtKSkgKwogICMgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbC5idWxrLCAKICAgICAgICB4bWF4ID0gZDE0Y191LmJ1bGssCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sLmluYywgCiAgICAgICAgeW1heCA9IGQxNGNfdS5pbmMsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgd2lkdGggPSAxLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDE5KSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtICgyMDAxKSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMDEpIiA9IDE2KSkgKwogIGNvb3JkX2ZpeGVkKHhsaW0gPSBjKC0xMDAsIDIwMCksIHlsaW0gPSBjKC0xMDAsIDIwMCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgIyBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpzcmEuMTkuaW5jLmJsazIgICU+JQogIGJpbmRfcm93cyguLCBzcmEuMDEuaW5jLmJsazJbICwgd2hpY2gobmFtZXMoc3JhLjE5LmluYy5ibGsyKSAlaW4lIG5hbWVzKHNyYS4wMS5pbmMuYmxrMikpXSkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgWWVhciwgIikiKSkgJT4lCiAgZmlsdGVyKGQxNGNfbWVhbi5pbmMgPiAtMjAwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfbWVhbi5idWxrLCBkMTRjX21lYW4uaW5jLCBjb2xvciA9IGVjbykpICsKICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGVjbywgc2hhcGUgPSBlY29ZZWFyKSwgc2l6ZSA9IDMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLmJ1bGssIAogICAgICAgIHhtYXggPSBkMTRjX3UuYnVsaywKICAgICAgICBjb2xvciA9IGVjbyksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sLmluYywgCiAgICAgICAgeW1heCA9IGQxNGNfdS5pbmMsCiAgICAgICAgY29sb3IgPSBlY28pLCAKICAgIHdpZHRoID0gMS41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSBjb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IGNvbGQpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMTkpIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMTkpIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKDIwMDEpIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcpKSArCiAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEwMCwgMjAwKSwgeWxpbSA9IGMoLTEwMCwgMjAwKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQnVsayBzb2lsICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICAjIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgIyAyMDAxCiMgc3JhLjAxLmluYy5ibGsyICU+JQojICAgZmlsdGVyKGQxNGNfbWVhbi5idWxrID4gLTEwMCAmIGQxNGNfbWVhbi5pbmMgPiAtMTAwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19tZWFuLmJ1bGssIGQxNGNfbWVhbi5pbmMsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBncm91cCA9IHBtKSkgKwojICAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKIyAgICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSkgKwojICAgZ2VvbV9lcnJvcmJhcmgoCiMgICAgIGFlcyh4bWluID0gZDE0Y19sLmJ1bGssIAojICAgICAgICAgeG1heCA9IGQxNGNfdS5idWxrLAojICAgICAgICAgY29sb3IgPSBwbSksIAojICAgICBoZWlnaHQgPSAxLjUpICsKIyAgIGdlb21fZXJyb3JiYXIoCiMgICAgIGFlcyh5bWluID0gZDE0Y19sLmluYywgCiMgICAgICAgICB5bWF4ID0gZDE0Y191LmluYywKIyAgICAgICAgIGNvbG9yID0gcG0pLCAKIyAgICAgd2lkdGggPSAxLjUpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwojICAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEwMCwgMjAwKSwgeWxpbSA9IGMoLTEwMCwgMjAwKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdCdWxrIHNvaWwgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ0luY3ViYXRpb24gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIAojICMgMjAxOQojICAKIyBzcmEuMTkuaW5jLmJsazIgJT4lCiMgICBtdXRhdGUoZGVwdGggPSBmYWN0b3IobHlyX2JvdCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4uYnVsaywgZDE0Y19tZWFuLmluYywgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gcG0pKSArCiMgICAjIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFKSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2wuYnVsaywgCiMgICAgICAgICB4bWF4ID0gZDE0Y191LmJ1bGssCiMgICAgICAgICBjb2xvciA9IHBtKSwgCiMgICAgIGhlaWdodCA9IDEuNSkgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2wuaW5jLCAKIyAgICAgICAgIHltYXggPSBkMTRjX3UuaW5jLAojICAgICAgICAgY29sb3IgPSBwbSksIAojICAgICB3aWR0aCA9IDEuNSkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDIpKSArCiMgICBjb29yZF9maXhlZCh4bGltID0gYygtMTAwLCAyMDApLCB5bGltID0gYygtMTAwLCAyMDApKSArCiMgICB4bGFiKGV4cHJlc3Npb24oJ0J1bGsgc29pbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBSZWdyZXNzaW9uIG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFJlZ3Jlc3Npb25zIG9mICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIGFuZCByZXNwaXJlZCBDT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBidWxrIHNvaWwsIHBvaW50cyBzaG93IG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciBidWxrIHNvaWxzIGFuZCBzaW5nbGUgb2JzZXJ2YXRpb25zIGZvciByZXNwaXJlZCBDT34yfi4KCiMjIFRpbWUgc2VyaWVzOiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIChhcyBtZWFzdXJlZCkKYGBge3IgcGxvdC10aW1lc2VyaWVzLW1lYXMtZGVwdGhzfQojIGNvbWJpbmUgJzAxLCAnMDksICcxOSBkYXRhCnNyYS4wMS4xOS5yYXcgPC0gcmJpbmQoYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scyksCiAgICAgICAgICAgICAgICAgICAgICAgYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpCnNyYS4yMDA5LmRmIDwtIHNyYS4wOS5zdW1bICwgd2hpY2gobmFtZXMoc3JhLjA5LnN1bSkgJWluJSBuYW1lcyhzcmEuMDEuMTkucmF3KSldCnNyYS4yMDA5LmRmIDwtIGNiaW5kKHNyYS4yMDA5LmRmLCAKICAgICAgICAgICAgICAgICAgICAgZm0gPSBOQSwKICAgICAgICAgICAgICAgICAgICAgZDE0Y19zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICBkMTRjX3UgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgZDE0Y19sID0gTkEpCnNyYS4wMS4wOS4xOS5yYXcgPC0gcmJpbmQoc3JhLjAxLjE5LnJhdywgc3JhLjIwMDkuZGYpCnNyYS4wMS4wOS4xOS5yYXckWWVhciA8LSBmYWN0b3IoYyhyZXAoMjAwMSwgbnJvdyhiaW5kX3Jvd3Moc3JhLjIwMDEuc3VtLmxzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKDIwMTksIG5yb3coYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgyMDA5LCBucm93KHNyYS4yMDA5LmRmKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjIwMDEiLCAiMjAwOSIsICIyMDE5IikpCgojIHBsb3QKIyB3LyByaWJib25zCiMgc3JhLjAxLjA5LjE5LnJhdyAlPiUKIyAgIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKIyAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiMgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiMgICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiMgICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKIyAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9yaWJib24oYWVzKHhtaW4gPSBkMTRjX2wsIHhtYXggPSBkMTRjX3UsIGZpbGwgPSBwbSwgYWxwaGEgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpLAojICAgICAgICAgICAgICAgY29sb3IgPSBOQSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwojICAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDIpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKwojICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiMgICBzY2FsZV95X3JldmVyc2UoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAyMiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAyMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAyNCkpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IC42LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC40LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4yKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKCJEZXB0aCAoY20pIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBsaXR0ZXIKc3JhLjIwMTkuaW5jLkwuZGYgPC0gZGF0YS5mcmFtZSgKICBzcmEuMjAxOS5pbmNfTC5kZiAlPiUKICAgIGdyb3VwX2J5KFllYXIsIFBNLCBlY28sIGx5cl9ib3QsIFBNZWNvKSAlPiUKICAgIHN1bW1hcml6ZShhY3Jvc3MoLmNvbHMgPSBkMTRjLCAKICAgICAgICAgICAgICAgICAgICAgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIG1pbiA9IG1pbiwgbWF4ID0gbWF4KSkpICU+JQogICAgcmVuYW1lKHllYXIgPSBZZWFyLCBkMTRjID0gZDE0Y19tZWFuKSAlPiUKICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKGVjbyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpKQojIGZvciBwbG90dGluZyBiZWxvdwpzcmEuMjAxOS5pbmMuTC5kZjIgPC0gc3JhLjIwMTkuaW5jLkwuZGYgJT4lCiAgcmVuYW1lKGQxNGNfbCA9IGQxNGNfbWluLAogICAgICAgICBkMTRjX3UgPSBkMTRjX21heCkgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIHllYXIpKQoKIyB3aXRoIGVycm9yIGJhcnMsIGFsbCBkZXB0aHMKc3JhLjAxLjA5LjE5LnJhdyAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDMuNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHNyYS4yMDE5LmluYy5MLmRmMiwgCiAgICAgICAgICAgICBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28pLCBzaGFwZSA9IDgsIHNpemUgPSAzLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSwKICAgICAgICBhbHBoYSA9IFllYXIpLAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAzKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGp1c3QgdG9wc29pbCwgdy8gZXJyb3IgYmFycwogCnNyYS4wMS4wOS4xOS5yYXcgPC0gc3JhLjAxLjA5LjE5LnJhd1tvcmRlcihzcmEuMDEuMDkuMTkucmF3JGx5cl90b3ApLCBdCnNyYS4wMS4wOS4xOS5yYXcgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwbSwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0sCiAgICAgICAgYWxwaGEgPSBZZWFyKSwKICAgIGhlaWdodCA9IDEuNSkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDQxLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xNjAsIDE5MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAic29saWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9ICJkb3R0ZWQiKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBUaW1lIHNlcmllcyBvZiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoLCBhcyBtZWFzdXJlZCoqCgo+KkNhcHRpb246KiBQb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHByb2ZpbGUgcmVwbGljYXRlcyBmb3IgMjAwMSwgMjAwOSwgYW5kIDIwMTkgc2FtcGxlcy4gRXJyb3IgYmFycyBzaG93IMKxIDEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuIChvbmx5IGEgc2luZ2xlIHByb2ZpbGUgd2FzIGFuYWx5emVkIGluIDIwMDkpLiBTdGFycyBzaG93IGxpdHRlciBpbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMtQ09+Mn4gZm9yIDIwMTkgc2FtcGxlcyBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCiMjIFNwbGluZSBmaXR0aW5nCgpTb2lscyBjb2xsZWN0ZWQgaW4gYm90aCB0aGUgMjAwMSBhbmQgMjAwOSBzYW1wbGluZyBjYW1wYWlnbnMgd2VyZSBzYW1wbGVkIGJ5IGhvcml6b24sIGJ1dCB0aGUgZGVwdGggaW50ZXJ2YWxzIGRpZmZlcmVkIGJldHdlZW4gdGhlIHR3byBzYW1wbGluZyB5ZWFycy4gSW4gMjAwOSwgZnVsbCBwcm9maWxlcyB3ZXJlIGV4Y2F2YXRlZCBmb3IgZWFjaCBzaXRlLCBhcyBvcHBvc2VkIHRvIHRoZSBzaG9ydGVyIHByb2ZpbGVzIGNvbGxlY3RlZCBpbiAyMDAxIGZyb20gdGhlIEdSIGFuZCBBTiBzaXRlcy4gUmFkaW9jYXJib24gd2FzIG1lYXN1cmVkIG9uIGFsbCB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgYXQgZWFjaCBzaXRlIGZvciB0aGUgMjAwMSBzYW1wbGVzLCBidXQgb25seSBmb3Igb25lIG9mIHRoZSByZXBsaWNhdGUgcHJvZmlsZXMgYXQgZWFjaCBzaXRlIGluIDIwMDksIGUuZy4gQU5wcCByZXAyLCBldGMuCgpJbiBvcmRlciB0byBjb21wYXJlIHRoZSByYWRpb2NhcmJvbiBwcm9maWxlcyBiZXR3ZWVuIDIwMDEsIDIwMDksIGFuZCAyMDE5IHdlIGZpcnN0IGludGVycG9sYXRlZCBib3RoIHJhZGlvY2FyYm9uIGFuZCBjYXJib24gc3RvY2sgZGF0YSBhdCAxIGNtIGludGVydmFscyBmb3IgZWFjaCBzaXRlIGluIHRoZSBkYXRhc2V0cyBmcm9tIGVhY2ggeWVhci4gVGhlIGNhcmJvbi1zdG9jay13ZWlnaHRlZCByYWRpb2NhcmJvbiB2YWx1ZXMgZm9yIGFueSBnaXZlbiB0YXJnZXQgZGVwdGggaW50ZXJ2YWwgY2FuIHRoZW4gYmUgY2FsY3VsYXRlZCBhcyBhIHNpbXBsZSBzdW0gb2YgdGhlIHByb2R1Y3Qgb2YgdGhlIGNhcmJvbiB3ZWlnaHQgb2YgZWFjaCAxIGNtIGluY3JlbWVudCAocmVsYXRpdmUgdG8gdGhlIHRvdGFsIGNhcmJvbiBzdG9jayBvZiB0aGUgdGFyZ2V0IGRlcHRoIGludGVydmFsKSBhbmQgaXRzIHJhZGlvY2FyYm9uIHZhbHVlLiBBIG1vbm90b25pYyBjdWJpYyBzcGxpbmUgZml0IHdpdGggSHltYW4gZmlsdGVyaW5nIHdhcyB1c2VkIGZvciB0aGUgY2FyYm9uIHN0b2NrIGludGVycG9sYXRpb24gKFdlbmR0IGFuZCBIYXVzZXIgMjAxMyksIGFuZCBhIG1hc3MtcHJlc2VydmluZyBzcGxpbmUgd2FzIHVzZWQgdG8gZml0IHRoZSByYWRpb2NhcmJvbiBkYXRhIChCaXNob3AsIFQuRi5BLiwgTWNCcmF0bmV5LCBBLkIuLCBMYXNsZXR0LCBHLk0uLCAoMTk5OSkgTW9kZWxsaW5nIHNvaWwgYXR0cmlidXRlIGRlcHRoIGZ1bmN0aW9ucyB3aXRoIGVxdWFsLWFyZWEgcXVhZHJhdGljIHNtb290aGluZyBzcGxpbmVzLiBHZW9kZXJtYSwgOTEoMS0yKTogMjctNDUpLgoKYGBge3IgY24tY2xlYW4sIGluY2x1ZGUgPSBGQUxTRX0KZWxtX3Jlc3VsdHNfZGYgPC0gYmluZF9yb3dzKHVubGlzdChlbG1fcmVzdWx0c19scywgcmVjdXJzaXZlID0gRkFMU0UpKQojIFNwbGl0IElEcwpQTWVjb19yZXBfZGVwdGggPC0gYmluZF9yb3dzKAogIGxhcHBseShzdHJzcGxpdChlbG1fcmVzdWx0c19kZiRJRCwgIl8iKSwgZnVuY3Rpb24oeCkgeyAKICAgIGRmIDwtICBkYXRhLmZyYW1lKFBNZWNvID0geFsyXSwKICAgICAgICAgICAgICAgICAgICAgIHByb19yZXAgPSB4WzNdLAogICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSB4WzRdKQogICAgZGYkUE0gPC0gc3Vic3RyKGRmJFBNZWNvLCAxLCAyKQogICAgZGYkRUNPIDwtIHN1YnN0cihkZiRQTWVjbywgMywgNCkKICAgIHJldHVybihkZikKICB9KQopCmVsbV9yZXN1bHRzX2RmIDwtIGNiaW5kKGVsbV9yZXN1bHRzX2RmLCBQTWVjb19yZXBfZGVwdGgpCmBgYAoKYGBge3Igc29jLTIwMDEsIGluY2x1ZGUgPSBGQUxTRX0KIyBtZXJnZSBzb2MuMjAwMS5scyBhbmQgc3JhLjIwMDEubHMgdG8gYWRkIFNPQyBkYXRhCnNyYS4yMDAxLmxzIDwtIG1hcHBseShtZXJnZSwgc3JhLjIwMDEubHMsIHNvYy4yMDAxLmxzLCBTSU1QTElGWSA9IEZBTFNFKQoKIyBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBzdG9ja3MKc3JhLjIwMDEubHMgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdICMgbWFrZSBzdXJlIHRvIG9yZGVyIGRhdGEKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXQogICAgICB9IGVsc2UgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldICsgeCRseXJfc29jX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKICByZXR1cm4odW5zcGxpdChscywgZGYkcHJvX25hbWUpKQp9KQpzYXZlKHNyYS4yMDAxLmxzLCBmaWxlID0gInNyYS4yMDAxLmxzLlJEYXRhIikKbG9hZCgic3JhLjIwMDEubHMuUkRhdGEiKQpgYGAKCmBgYHtyIHNwbGluZS1mbSwgaW5jbHVkZSA9IEZBTFNFfQojIyMgc3BsaW5lIGZpdCBmb3IgZm0KIyMgYnVsayAoc3BsaXQgYnkgcHJvIHJlcCkKIyAyMDAxCnNyYS4yMDAxLmZtLnNwIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gImZtIikKICAgIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOm1heCh4JGx5cl9ib3QpXQogICAgcmV0dXJuKHgubXBzKQogIH0pCn0pCiMgMjAwOQpzcmEuMjAwOS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKHgpIHsKICBkZXB0aHMoeCkgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gImx5cl9mcmFjdGlvbl9tb2Rlcm4iKQogIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOm1heCh4JGx5cl9ib3QpXQogIHJldHVybih4Lm1wcykKfSkKIyAyMDE5CnNyYS4yMDE5LmZtLnNwIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gImZtIikKICAgIHgubXBzJHZhci4xY20gPC0geC5tcHMkdmFyLjFjbVsxOm1heCh4JGx5cl9ib3QpXQogICAgcmV0dXJuKHgubXBzKQogIH0pCn0pCgojIyBpbmMKIyBuZWVkIG1pbiBhbmQgbWF4IHZhbHVlcyBmb3Igc3BsaW5lIGZpdHMKIyAyMDAxCnNyYS4yMDAxLmluYy5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMDEuaW5jLnN1bS5scywgZnVuY3Rpb24oZGYpIHsKICAgIGRlcHRocyhkZikgPC0gUE1lY28gfiBseXJfdG9wICsgbHlyX2JvdAogICAgbWVhbi5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX21lYW4iKQogICAgbWluLm1wcyA8LSBtcHNwbGluZShkZiwgdmFyLm5hbWUgPSAiZm1fbCIpCiAgICBtYXgubXBzIDwtIG1wc3BsaW5lKGRmLCB2YXIubmFtZSA9ICJmbV91IikKICAgIHJldHVybihsaXN0KG1lYW4udmFyLjFjbSA9IG1lYW4ubXBzJHZhci4xY21bMTptYXgoZGYkbHlyX2JvdCldLAogICAgICAgICAgICAgICAgbWluLnZhci4xY20gPSBtaW4ubXBzJHZhci4xY21bMTptYXgoZGYkbHlyX2JvdCldLAogICAgICAgICAgICAgICAgbWF4LnZhci4xY20gPSBtYXgubXBzJHZhci4xY21bMTptYXgoZGYkbHlyX2JvdCldKSkKICB9KQojIDIwMTkKc3JhLjIwMTkuaW5jLmZtLnNwIDwtIGxhcHBseShzcmEuMjAxOS5pbmMuc3VtLmxzLCBmdW5jdGlvbihkZikgewogIGRmIDwtIGRmWy13aGljaChkZiRseXJfYm90ID09IDApLCBdCiAgZGVwdGhzKGRmKSA8LSBQTWVjbyB+IGx5cl90b3AgKyBseXJfYm90CiAgbWVhbi5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX21lYW4iKQogIG1pbi5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX2wiKQogIG1heC5tcHMgPC0gbXBzcGxpbmUoZGYsIHZhci5uYW1lID0gImZtX3UiKQogIHJldHVybihsaXN0KG1lYW4udmFyLjFjbSA9IG1lYW4ubXBzJHZhci4xY21bMTptYXgoZGYkbHlyX2JvdCldLAogICAgICAgICAgICAgIG1pbi52YXIuMWNtID0gbWluLm1wcyR2YXIuMWNtWzE6bWF4KGRmJGx5cl9ib3QpXSwKICAgICAgICAgICAgICBtYXgudmFyLjFjbSA9IG1heC5tcHMkdmFyLjFjbVsxOm1heChkZiRseXJfYm90KV0pKQp9KQpgYGAKCmBgYHtyIHNwbGluZS1iZC1zb2MtMTksIGluY2x1ZGUgPSBGQUxTRX0KIyBOZWVkIFNPQyBzdG9jayBkYXRhIGZvciAyMDE5IHNhbXBsZXM6IHVzZSBtYXNzIGRhdGEgZnJvbSAyMDA5IHNhbXBsZXMgCiMgc3BsaW5lIGZpdCBmb3IgY210diBtYXNzOyBzcGVjaWZ5IDEwY20gZGVwdGhzCnNyYS4yMDA5Lm1hc3Muc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbihkZikgewogIGRlcHRocyhkZikgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogIGRmLm1wcyA8LSBtcHNwbGluZShkZiwgdmFyLm5hbWUgPSAibWFzc19rZ20yIiwgZCA9IHNlcSgwLCBtYXgoZGYkbHlyX2JvdCksIGJ5ID0gMTApKQogIHJldHVybihkZi5tcHMpCn0pCgpzcmEuMjAwOS5iZC5zcCA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGVwdGhzKGRmKSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgZGYubXBzIDwtIG1wc3BsaW5lKGRmLCB2YXIubmFtZSA9ICJCRF9nX2NtXzMiLCBkID0gc2VxKDAsIG1heChkZiRseXJfYm90KSwgYnkgPSAxMCkpCiAgcmV0dXJuKGRmLm1wcykKfSkKCiMgY2FsY3VsYXRlIG1lYW4gb2YgMWNtIG1hc3MgcHJlZGljdGlvbnMgZm9yIGVhY2ggMjAxOSBkZXB0aCBpbmNyZW1lbnQKbWFzc19wcmVkIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkubWFzcy5zcCksIGZ1bmN0aW9uKGkpIHsKICBscyA8LSBzcGxpdChzcmEuMjAxOS5sc1tbaV1dLCBzcmEuMjAxOS5sc1tbaV1dWyJwcm9fcmVwIl0pICMgc3BsaXQgZWFjaCByZXBsaWNhdGUgcHJvZmlsZQogIGxzIDwtIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgIHQoc3JhLjIwMDkubWFzcy5zcFtbaV1dW1sidmFyLnN0ZCJdXSlbMTpucm93KGRmKV0gIyBtYXNzX2tnbTIKICAgIH0pCiAgcmV0dXJuKHVuc3BsaXQobHMsIHNyYS4yMDE5LmxzW1tpXV1bInByb19yZXAiXSkpCn0pCgojIGNhbGN1bGF0ZSBtZWFuIG9mIDFjbSBCRCBwcmVkaWN0aW9ucyBmb3IgZWFjaCAyMDE5IGRlcHRoIGluY3JlbWVudApiZF9wcmVkIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkuYmQuc3ApLCBmdW5jdGlvbihpKSB7CiAgbHMgPC0gc3BsaXQoc3JhLjIwMTkubHNbW2ldXSwgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSAjIHNwbGl0IGVhY2ggcmVwbGljYXRlIHByb2ZpbGUKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICB0KHNyYS4yMDA5LmJkLnNwW1tpXV1bWyJ2YXIuc3RkIl1dKVsxOm5yb3coZGYpXSAjIG1hc3Nfa2dtMgogICAgfSkKICByZXR1cm4odW5zcGxpdChscywgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSkKfSkKCiMgbWVyZ2UgcHJlZGljdGVkIG1hc3MgdmFsdWVzIHdpdGggc3JhLjIwMTkubHMKbm1zIDwtIG5hbWVzKHNyYS4yMDE5LmxzKQpzcmEuMjAxOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5LmxzKSwgZnVuY3Rpb24oZGYpIHsKICBjYmluZChzcmEuMjAxOS5sc1tbZGZdXSwgYmRfZ19jbTMgPSBiZF9wcmVkW1tkZl1dKQp9KQpuYW1lcyhzcmEuMjAxOS5scykgPC0gbm1zCgojIGFkZCBjIGNvbmMKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGRmJGRlcHRoIDwtIHBhc3RlMChkZiRseXJfdG9wLCAiLSIsIGRmJGx5cl9ib3QpCiAgZGYgPC0gbWVyZ2UoZGYsIGVsbV9yZXN1bHRzX2RmWyAsIGMoIlBNZWNvIiwgInByb19yZXAiLCAiZGVwdGgiLCAiQyIsICJOIildLCBieSA9IGMoIlBNZWNvIiwgImRlcHRoIiwgInByb19yZXAiKSkKICByZXR1cm4oZGYpCn0pCgojIyBjYWxjdWxhdGUgc3RvY2tzIGFuZCBjdW11bGF0aXZlIHN0b2Nrcwpjc3RvY2suZnggPC0gZnVuY3Rpb24obHMsIG1hc3MsIGJkLCBDKSB7CiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgaWYgKGlzLm5hKG1hc3MpKSB7CiAgICAgZGYkbHlyX3NvYyA8LSBkZltbYmRdXSAqIGRmW1tDXV0gKiAoZGYkbHlyX2JvdCAtIGRmJGx5cl90b3ApICogMTBeLTEgCiAgICB9IGVsc2UgewogICAgIGRmJGx5cl9zb2MgPC0gZGZbW21hc3NdXSAqIGRmW1tDXV0gKiAxMF4tMiAKICAgIH0KICAgIHByb19scyA8LSBzcGxpdChkZiwgZGYkcHJvX25hbWUpCiAgICBwcm9fbHMgPC0gbGFwcGx5KHByb19scywgZnVuY3Rpb24oeCkgewogICAgICB4JGx5cl9zb2NfY210diA8LSBOQQogICAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICAgIGlmKGkgPT0gMSkgewogICAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jW2ldCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY1tpXSArIHgkbHlyX3NvY19jbXR2W2ktMV0gCiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybih4KQogICAgfSkKICAgIHJldHVybih1bnNwbGl0KHByb19scywgZGYkcHJvX25hbWUpKQogIH0pCn0KIyAyMDE5CnNyYS4yMDE5LmxzIDwtIGNzdG9jay5meChzcmEuMjAxOS5scywgbWFzcyA9IE5BLCBiZCA9ICJiZF9nX2NtMyIsICJDIikKIyAyMDA5CnNyYS4yMDA5LmxzIDwtIGNzdG9jay5meChzcmEuMjAwOS5scywgIm1hc3Nfa2dtMiIsIGJkID0gTkEsICJDX3BjdCIpCgojIHNhdmUKc2F2ZShzcmEuMjAxOS5scywgZmlsZSA9ICJzcmEuMjAxOS5scy5SRGF0YSIpCiMgd3JpdGUuY3N2KGJpbmRfcm93cyhzcmEuMjAxOS5scyksIGZpbGUgPSAic3JhLjIwMTkuZGYuY3N2IikKCiMgbWFrZSBkZgpzcmEuMjAxOS5zdW0uZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICAgIGRmICU+JQogICAgICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MoYyhmbSwgYmRfZ19jbTMsIEMsIE4sIGx5cl9zb2MpLCAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICAgICAgc2VsZWN0KC1iZF9nX2NtM19zZCkgJT4lCiAgICAgIGRhdGEuZnJhbWUKICB9KQogICwgLmlkID0gIlBNZWNvIikKIyB3cml0ZS5jc3Yoc3JhLjIwMTkuc3VtLmRmLCBmaWxlID0gIi9Vc2Vycy9qZWZmL0Rlc2t0b3Avc3JhLjIwMTkuc3VtLmNzdiIpCmBgYAoKYGBge3Igc3BsaW5lLXNvYywgaW5jbHVkZSA9IEZBTFNFfQojIHNwbGluZSBmaXQgZm9yIGNhcmJvbiBzdG9ja3MgKGZvciBjYWxjIHdlaWdodGVkIGF2ZXJhZ2VzKQpkZXB0aC5zcGxpbmUgPC0gZnVuY3Rpb24oeCwgdmFyX2NtdHYgPSAibHlyX3NvYyIpIHsKICBzcCA8LSBzcGxpbmUoeCwgbWV0aG9kID0gImh5bWFuIikgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogIHNwLnNzIDwtIHNtb290aC5zcGxpbmUoc3ApICMgY29udmVydCB0byBjbGFzcyAic3BsaW5lIiB3aXRoIHNtb290aC5zcGxpbmUgZnhuCiAgc3RkIDwtIHNlcSgwLCBtYXgoeCRseXJfYm90KSkgIyBpbiBjbSAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogIHNwIDwtIHByZWRpY3Qoc3Auc3MsIHN0ZCkgCiAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICBjb2xuYW1lcyhkZikgPC0gYygibHlyX2JvdCIsIHZhcl9jbXR2KSAjIHdoZXJlIHZhcl9jbXR2ID0gY3VtdWxhdGl2ZSB2YXJpYWJsZSBpbiBzcGxpbmUgb3V0cHV0CiAgZm9yKGkgaW4gc2VxX2Fsb25nKGRmJGx5cl9ib3QpKSB7CiAgICBpZihpID09IDEpIHsKICAgICAgZGZbW3Zhcl9jbXR2XV1baV0gPC0gZGZbW3Zhcl9jbXR2XV1baV0KICAgIH0gZWxzZSB7CiAgICAgIGRmW1t2YXJfY210dl1dW2ldIDwtIGRmW1t2YXJfY210dl1dW2kgKyAxXSAtIGRmW1t2YXJfY210dl1dW2ldCiAgICB9CiAgfQogIGRmIDwtIGRmWy0xLF0KICByZXR1cm4oZGZbLWxlbmd0aChkZltbdmFyX2NtdHZdXSksIF0pCn0KCiMjIGFkZCAoMCwgMCkgcG9pbnQgZm9yIChseXJfYm90LCBseXJfY210dl9zdG9jaykKIyAyMDAxCnNyYS4yMDAxLnNwLmxzIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBscyA8LSBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKHgpKSkKICAgIHh5IDwtIGMod2hpY2gobmFtZXMoeCkgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoeCkgPT0gImx5cl9zb2NfY210diIpKQogICAgdDBbICwgeHldIDwtIDAKICAgIG5hbWVzKHQwKSA8LSBuYW1lcyh4KQogICAgdDAkcHJvX25hbWUgPC0gdW5pcXVlKHgkcHJvX25hbWUpCiAgICByZXR1cm4ocmJpbmQodDAsIHgpKQogIH0pCiAgcmV0dXJuKGJpbmRfcm93cyhscykpCn0pCnNyYS4yMDAxLnNwLmxzLmF2ZyA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzMiwgZnVuY3Rpb24oZGYpIHsKICB4eSA8LSBkZlsgLCBjKCJseXJfYm90IiwgImx5cl9zb2NfY210diIpXQogIHQwIDwtIGRhdGEuZnJhbWUobHlyX2JvdCA9IDAsIGx5cl9zb2NfY210diA9IDApCiAgcmV0dXJuKHJiaW5kKHQwLCB4eSkpCn0pCiMgMjAwOQpzcmEuMjAwOS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKGRmKSkpCiAgeHkgPC0gYyh3aGljaChuYW1lcyhkZikgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoZGYpID09ICJseXJfc29jX2NtdHYiKSkKICB0MFsgLCB4eV0gPC0gMAogIG5hbWVzKHQwKSA8LSBuYW1lcyhkZikKICBuZXcgPC0gcmJpbmQodDAsIGRmKQogIHJldHVybihuZXcpCn0pCiMgMjAxOQpzcmEuMjAxOS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbHMgPC0gbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbCh4KSkpCiAgICB4eSA8LSBjKHdoaWNoKG5hbWVzKHgpID09ICJseXJfYm90IiksIHdoaWNoKG5hbWVzKHgpID09ICJseXJfc29jX2NtdHYiKSkKICAgIHQwWyAsIHh5XSA8LSAwCiAgICBuYW1lcyh0MCkgPC0gbmFtZXMoeCkKICAgIHQwJHByb19uYW1lIDwtIHVuaXF1ZSh4JHByb19uYW1lKQogICAgcmV0dXJuKHJiaW5kKHQwLCB4KSkKICB9KQogIHJldHVybihiaW5kX3Jvd3MobHMpKQp9KQoKIyMgcnVuIHNwbGluZQojIDIwMDEKc3JhLjIwMDEub2Muc3AgPC0gbGFwcGx5KHNyYS4yMDAxLnNwLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICBkZXB0aC5zcGxpbmUoeFssIGMoImx5cl9ib3QiLCAibHlyX3NvY19jbXR2IildKQogIH0pCn0pCnNyYS4yMDAxLm9jLnNwLmF2ZyA8LSBsYXBwbHkoc3JhLjIwMDEuc3AubHMuYXZnLCBmdW5jdGlvbihkZikgewogIGRlcHRoLnNwbGluZShkZikKfSkKIyAyMDA5CnNyYS4yMDA5Lm9jLnNwIDwtIGxhcHBseShzcmEuMjAwOS5zcC5scywgZnVuY3Rpb24oeCkgewogIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCn0pCiMgMjAxOQpzcmEuMjAxOS5vYy5zcCA8LSBsYXBwbHkoc3JhLjIwMTkuc3AubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRoLnNwbGluZSh4WywgYygibHlyX2JvdCIsICJseXJfc29jX2NtdHYiKV0pCiAgfSkKfSkKc3JhLjIwMTkub2Muc3AuYXZnIDwtIGxhcHBseShzcmEuMjAxOS5vYy5zcCwgZnVuY3Rpb24obHMpIHsKICBiaW5kX3Jvd3MobHMpICU+JQogICAgZ3JvdXBfYnkobHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUobHlyX3NvYyA9IG1lYW4obHlyX3NvYykpICU+JQogICAgZGF0YS5mcmFtZQp9KQoKIyBzcGxpbmUgJzAxIGZsdXhlcwp0cy5yZXAuYXZnLnNwIDwtIGxhcHBseShzcGxpdCh0cy5yZXAuYXZnLCB0cy5yZXAuYXZnJHllYXIpLCBmdW5jdGlvbih5KSB7CiAgbGFwcGx5KHNwbGl0KHksIHkkUE1lY29feWVhcl9yZXApLCBmdW5jdGlvbih4KSB7CiAgICAgIHggPC0gZGF0YS5mcmFtZSh4KQogICAgICBpZiAoeCR5ZWFyWzFdID09ICIyMDAxIikgewogICAgICAgICMgcnVuIG1wc3BsaW5lCiAgICAgICAgZGVwdGhzKHgpIDwtIFBNZWNvX3llYXJfcmVwIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgICAgICBtcHMgPC0gbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibWdDTzJfZ0NfZF9hdmciLCBkID0gYygwLCAxMCwgMjAsIDMwKSkKICAgICAgICBtcHMuc3RkIDwtIG1wcyR2YXIuc3RkCiAgICAgICAgZGF0YS5mcmFtZShseXJfYm90ID0gYygxMCwgMjAsIDMwKSwgZmx4ID0gdChtcHMkdmFyLnN0ZFsxOjNdKSwgcm93Lm5hbWVzID0gTlVMTCkKICAgICAgfSBlbHNlIHsKICAgICAgICBkYXRhLmZyYW1lKGx5cl9ib3QgPSB4JGx5cl9ib3QsIGZseCA9IHgkbWdDTzJfZ0NfZF9hdmcpCiAgICAgIH0KICB9KQp9KQoKIyBzcGxpbmUgMTRDCiMgZHVwbGljYXRlIHNyYS4yMDAxLmluYy5scwpzcmEuMjAwMS5pbmMubHMyIDwtIHNyYS4yMDAxLmluYy5scwojIGNvbWJpbmUgYSBhbmQgYiByZXBzIGZvciBBTndmIChvbmx5IGhhdmUgZGF0YSBmb3Igb25lIHJlcCBwZXIgaW5jcmVtZW50KQpzcmEuMjAwMS5pbmMubHMyJEFOd2YkcmVwIDwtICJhIiAKIyBydW4gbXBzcGxpbmUgb24gZm0gZGF0YSBhbmQgcmV0dXJuIDFjbSBpbmNyZW1lbnRzIGZvciAwLTMwIGNtCnNyYS4yMDAxLmluYy5zcCA8LSBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDAxLmluYy5sczIsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkUE1lY29feWVhcl9yZXAgPC0gcGFzdGUoZGYkUE1lY28sIGRmJFllYXIsIGRmJHJlcCwgc2VwID0gIl8iKQogIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZGYsIGRmJFBNZWNvX3llYXJfcmVwKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIFBNZWNvX3llYXJfcmVwIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHNwIDwtIG1wc3BsaW5lKHgsICJmbSIsIGQgPSBjKDAsIDEwLCAyMCwgMzApKQogICAgZGF0YS5mcmFtZShseXJfYm90ID0gYygxMCwgMjAsIDMwKSwKICAgICAgICAgICAgICAgUE1lY29feWVhcl9yZXAgPSBzcCRpZGNvbCwKICAgICAgICAgICAgICAgZm0gPSB0KHNwJHZhci5zdGRbMTozXSkpCiAgfSkpCn0pKQpzcmEuMjAwMS5pbmMuc3AubHMgPC0gc3BsaXQoc3JhLjIwMDEuaW5jLnNwLCBzcmEuMjAwMS5pbmMuc3AkUE1lY29feWVhcl9yZXApCgojIGNvbWJpbmUgMTRjIGFuZCBmbHV4IGRhdGEKIyAxLiBzdHJpcCBvdXQgbWlzc2luZyBkYXRhCnRzLnJlcC5hdmcuc3AkYDIwMDFgIDwtIHRzLnJlcC5hdmcuc3AkYDIwMDFgWy13aGljaChuYW1lcyh0cy5yZXAuYXZnLnNwJGAyMDAxYCkgPT0gIkFOcmZfMjAwMV9hIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXModHMucmVwLmF2Zy5zcCRgMjAwMWApID09ICJBTndmXzIwMDFfYiIpXQojIGNvbWJpbmUgJzAxIGRhdGEKZmx4LjE0Yy5yZXAuMDEuc3AgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIG1hcHBseSgKICAgICAgbWVyZ2UsCiAgICAgIHRzLnJlcC5hdmcuMDEuc3AsCiAgICAgIHNyYS4yMDAxLmluYy5zcC5scywKICAgICAgU0lNUExJRlkgPSBGQUxTRSksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHggPC0geFtjb21wbGV0ZS5jYXNlcyh4KSwgXQogICAgICB4JGZseC53dCA8LSB4JGZseCAvIHN1bSh4JGZseCkKICAgICAgeCRmbS53dGQgPC0geCRmbSAqIHgkZmx4Lnd0CiAgICAgIGRhdGEuZnJhbWUoUE1lY29feWVhcl9yZXAgPSB1bmlxdWUoeCRQTWVjb195ZWFyX3JlcCksIAogICAgICAgICAgICAgICAgIGx5cl9ib3QgPSBtYXgoeCRseXJfYm90KSwgCiAgICAgICAgICAgICAgICAgZm0ud3RkID0gc3VtKHgkZm0ud3RkKSkKICAgIH0pKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzdWJzdHIoUE1lY29feWVhcl9yZXAsIDEsIDQpLAogICAgICAgICB5ZWFyID0gc3Vic3RyKFBNZWNvX3llYXJfcmVwLCA2LCA5KSwKICAgICAgICAgZDE0Yy53dGQgPSBjb252ZXJ0X2ZtX2QxNGMoZm0gPSBmbS53dGQsIG9ic19kYXRlX3kgPSAyMDAxLCB2ZXJib3NlID0gRkFMU0UpKSAlPiUKICByZW5hbWUoZDE0Y19pbmMgPSBkMTRjLnd0ZCwKICAgICAgICAgZm1faW5jID0gZm0ud3RkKQogICMgZ3JvdXBfYnkoUE1lY28sIGx5cl9ib3QpICU+JQogICMgc3VtbWFyaXplKGFjcm9zcyhjKGZtLnd0ZCwgZDE0Yy53dGQpLCAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKQpzYXZlKGZseC4xNGMucmVwLjAxLnNwLCBmaWxlID0gImZseC4xNGMucmVwLjAxLnNwLlJEYXRhIikKYGBgCgpgYGB7ciBwbG90LXNvYy1jbXR2fQojIDIwMDEKc3JhLjIwMDEuc29jLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLm9jLnNwLmF2ZyksIGZ1bmN0aW9uKGkpIHsKICBOTSA8LSBuYW1lcyhzcmEuMjAwMS5vYy5zcC5hdmcpW2ldCiAgUE0gPC0gc3Vic3RyKE5NLCAxLCAyKQogIEVDTyA8LSBzdWJzdHIoTk0sIDMsIDQpCiAgZGYgPC0gZGF0YS5mcmFtZShQTSA9IFBNLCBFQ08gPSBFQ08sIGx5cl9zb2NfMzAgPSBzdW0oc3JhLjIwMDEub2Muc3AuYXZnW1tpXV1bMTozMCwgImx5cl9zb2MiXSkpCiAgZGYkRUNPIDwtIGZhY3RvcihkZiRFQ08sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpCiAgcmV0dXJuKGRmKQp9KSkKCiMgMjAwOQpzcmEuMjAwOS5zb2MuZGYgPC0gYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgTk0gPC0gbmFtZXMoc3JhLjIwMDkub2Muc3ApW2ldCiAgUE0gPC0gc3Vic3RyKE5NLCAxLCAyKQogIEVDTyA8LSBzdWJzdHIoTk0sIDMsIDQpCiAgZGYgPC0gZGF0YS5mcmFtZShQTSA9IFBNLCBFQ08gPSBFQ08sIGx5cl9zb2NfMzAgPSBzdW0oc3JhLjIwMDkub2Muc3BbW2ldXVsxOjMwLCAibHlyX3NvYyJdKSkKICBkZiRFQ08gPC0gZmFjdG9yKGRmJEVDTywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkKICByZXR1cm4oZGYpCn0pKQoKIyAyMDE5CnNyYS4yMDE5LnNvYy5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5vYy5zcC5hdmcpLCBmdW5jdGlvbihpKSB7CiAgTk0gPC0gbmFtZXMoc3JhLjIwMTkub2Muc3AuYXZnKVtpXQogIFBNIDwtIHN1YnN0cihOTSwgMSwgMikKICBFQ08gPC0gc3Vic3RyKE5NLCAzLCA0KQogIGRmIDwtIGRhdGEuZnJhbWUoUE0gPSBQTSwgRUNPID0gRUNPLCBseXJfc29jXzMwID0gc3VtKHNyYS4yMDE5Lm9jLnNwLmF2Z1tbaV1dWzE6MzAsICJseXJfc29jIl0pKQogIGRmJEVDTyA8LSBmYWN0b3IoZGYkRUNPLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQogIHJldHVybihkZikKfSkpCgpnZ3Bsb3Qoc3JhLjIwMTkuc29jLmRmLCBhZXMoUE0sIGx5cl9zb2NfMzAsIGZpbGwgPSBQTSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFQ08pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCmdncGxvdChzcmEuMjAwOS5zb2MuZGYsIGFlcyhQTSwgbHlyX3NvY18zMCwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEVDTykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKZ2dwbG90KHNyYS4yMDAxLnNvYy5kZiwgYWVzKFBNLCBseXJfc29jXzMwLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRUNPKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIGFsbCB0b2dldGhlcgpzcmEuMDEuMDkuMTkuc29jLmRmIDwtIGNiaW5kKHJiaW5kKHNyYS4yMDAxLnNvYy5kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEuMjAwOS5zb2MuZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuc29jLmRmKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHJlcChjKDIwMDEsIDIwMDksIDIwMTkpLCBlYWNoID0gOSkpCnNyYS4wMS4wOS4xOS5zb2MuZGYgJT4lCiAgbXV0YXRlKFBNeWVhciA9IHBhc3RlMChQTSwgeWVhcikpICU+JQogIGdncGxvdCguLCBhZXMoUE15ZWFyLCBseXJfc29jXzMwLCBmaWxsID0gUE0sIGFscGhhID0geWVhcikpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFQ08pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBjd3QtZDE0Yy0wMSwgaW5jbHVkZSA9IEZBTFNFfQojIyBjYWxjdWxhdGUgc3RvY2sgd2VpZ2h0cwojIyAyMDAxIGRlcHRocwojIG9yZGVyICcwMSBkYXRhCnNyYS4yMDAxLnN1bS5scyA8LSBsYXBwbHkoc3JhLjIwMDEuc3VtLmxzLCBmdW5jdGlvbihkZikgZGZbb3JkZXIoZGYkbHlyX2JvdCksIF0pCiMgMjAwOQpjd3QuMDEuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICB9IGVsc2UgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICB9CiAgfQogIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpICMgcmV0dXJuIHdlaWdodHMKfSkKbmFtZXMoY3d0LjAxLjA5KSA8LSBuYW1lcyhzcmEuMjAwOS5vYy5zcCkKIyAyMDE5IChzZWNvbmQgbGlzdCBsZXZlbCBmcm9tIHByb2ZpbGUgcmVwcykKY3d0LjAxLjE5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNyYS4yMDE5Lm9jLnNwW1tpXV0sIGZ1bmN0aW9uKGRmKSB7CiAgICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXSAjIG1hcCBvbnRvICcwMSBkZXB0aHMKICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gZGZbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIGRmWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkgICMgcmV0dXJuIHdlaWdodHMKICB9KQp9KQpuYW1lcyhjd3QuMDEuMTkpIDwtIG5hbWVzKHNyYS4yMDE5Lm9jLnNwKQojIGF2ZXJhZ2UgY3d0ICcxOSBzYW1wbGVzLCAnMDEgZGVwdGhzCmN3dC4wMS4xOS5hdmcgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5vYy5zcC5hdmcpLCBmdW5jdGlvbihpKSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGNbW2pdXSA8LSBzcmEuMjAwMS5vYy5zcC5hdmdbW2ldXVsxOmRbal0sICJseXJfc29jIl0KICAgICAgfSBlbHNlIHsKICAgICAgICBjW1tqXV0gPC0gc3JhLjIwMDEub2Muc3AuYXZnW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQp9KQpuYW1lcyhjd3QuMDEuMTkuYXZnKSA8LSBuYW1lcyhzcmEuMjAxOS5vYy5zcCkKCiMjIGNhbGN1bGF0ZSBmbV93dHMKIyMgJzAxIGRlcHRocwojIDIwMTkKZm0ud3QuMDEuMTkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTkpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMTlbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxLjE5W1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDE5LmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxLjE5W1tpXV1bW2pdXSldCiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KSAKbmFtZXMoZm0ud3QuMDEuMTkpIDwtIG5hbWVzKGN3dC4wMS4xOSkKCiMgMjAwOQpmbS53dC4wMS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4wMS4wOSksIGZ1bmN0aW9uKGkpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4wMS4wOVtbaV1dKQogIGRmJGZtIDwtIHNyYS4yMDA5LmZtLnNwW1tpXV1bWyJ2YXIuMWNtIl1dWzE6bGVuZ3RoKGN3dC4wMS4wOVtbaV1dKV0KICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKfSkKbmFtZXMoZm0ud3QuMDEuMDkpIDwtIG5hbWVzKGN3dC4wMS4wOSkKCgojIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiBmbSBmb3IgZWFjaCBpbnRlcnZhbAojIyAnMDEgZGVwdGhzCiMgMjAwOQpzcmEuMDEuMDkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAwMS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4wOVtbaV1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICB9IGVsc2UgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjA5W1tpXV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgIH0KICB9CiAgcmV0dXJuKGNiaW5kKHNyYS4yMDAxLnN1bS5sc1tbaV1dLCBmbV8wOSA9IHVubGlzdChmKSkpCn0pCm5hbWVzKHNyYS4wMS4wOS5scykgPC0gbmFtZXMoZm0ud3QuMDEuMDkpCiMgMjAxOQpzcmEuMDEuMTkubHMgPC0gZm0ud3QuMDEuMTkgIyBpbml0aWFsaXplIGxpc3Qgd2l0aCBmbSB3dCBzdHJ1Y3R1cmUKc3JhLjAxLjE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIHNyYS4wMS4xOS5sc1tbaV1dIDwtIGxhcHBseShzZXFfYWxvbmcoZm0ud3QuMDEuMTlbW2ldXSksIGZ1bmN0aW9uKHgpIHsKICAgIGQgPC0gc3JhLjIwMDEuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4xOVtbaV1dW1t4XV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjAxLjE5W1tpXV1bW3hdXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGYpKSAKICB9KQogIGZtIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjAxLjE5LmxzW1tpXV1bWzFdXSksIGZ1bmN0aW9uKHopIHsKICAgIGRhdGEuZnJhbWUoZm1fMTlfbWVhbiA9IG1lYW4oc2FwcGx5KHNyYS4wMS4xOS5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICBmbV8xOV9zZCA9IHNkKHNhcHBseShzcmEuMDEuMTkubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSkKICAgIH0pCiAgZm0gPC0gYmluZF9yb3dzKGZtKQogIHJldHVybihmbSkKfSkKc3JhLjAxLjA5LjE5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjAxLjA5LmxzKSwgZnVuY3Rpb24oaSkgewogIGRhdGEuZnJhbWUoc3JhLjAxLjA5LmxzW1tpXV0sIHNyYS4wMS4xOS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuMDEuMDkuMTkubHMpIDwtIG5hbWVzKHNyYS4wMS4wOS5scykKCiMjIGNyZWF0ZSB0aWR5IGNvbWJpbmVkICcwMSwgJzA5LCAnMTkgZGF0YSBmcmFtZQpubXMgPC0gYygiUE0iLCAiRUNPIiwgIlBNZWNvIiwgImx5cl90b3AiLCAibHlyX2JvdCIsICJmbSIsICJmbV9zZCIpCnNyYS4wMS4wOS4xOS5kZiA8LSBiaW5kX3Jvd3Moc3JhLjAxLjA5LjE5LmxzKQpzcmEuMDEuMDkuMTkgPC0gc3JhLjAxLjA5LjE5LmRmWywgbm1zXQpzcmEuMDEuMDkuMTkgPC0gcmJpbmQoY2JpbmQoc3JhLjAxLjA5LjE5LCBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMDEpKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoc3JhLjAxLjA5LjE5Wywgbm1zWzE6NV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4wMS4wOS4xOS5kZiRmbV8wOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciA9IGFzLmNoYXJhY3RlcigyMDA5KSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHNyYS4wMS4wOS4xOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMDEuMDkuMTkuZGYkZm1fMTlfbWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBzcmEuMDEuMDkuMTkuZGYkZm1fMTlfc2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAxOSkpKQoKIyBjYWxjIGQxNGMgZnJvbSBmbQpzcmEuMDEuMDkuMTkkZDE0YyA8LSBjYWxjXzE0YyhzcmEuMDEuMDkuMTkkZm0sIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4wMS4wOS4xOSRZZWFyKSkpCnNyYS4wMS4wOS4xOSRkMTRjX3NkIDwtIGFicyhzcmEuMDEuMDkuMTkkZDE0YyAtIGNhbGNfMTRjKHNyYS4wMS4wOS4xOSRmbSArIHNyYS4wMS4wOS4xOSRmbV9zZCwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjAxLjA5LjE5JFllYXIpKSkpCmBgYAoKYGBge3IgY3d0LWQxNGMtMTksIGluY2x1ZGUgPSBGQUxTRX0KIyMgY2FsY3VsYXRlIHN0b2NrIHdlaWdodHMKIyMgMjAxOSBkZXB0aHMKIyAyMDAxCmN3dC4xOS4wMSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGxhcHBseShzcmEuMjAwMS5vYy5zcFtbaV1dLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gZGZbMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIGRmWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKICB9KQp9KQpuYW1lcyhjd3QuMTkuMDEpIDwtIG5hbWVzKHNyYS4yMDAxLm9jLnNwKQojIDIwMDEgbWVhbgpjd3QuMTkuMDEuYXZnIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEub2Muc3AuYXZnKSwgZnVuY3Rpb24oaSkgewogICAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gc3JhLjIwMDEub2Muc3AuYXZnW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIHNyYS4yMDAxLm9jLnNwLmF2Z1tbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkKfSkKbmFtZXMoY3d0LjE5LjAxLmF2ZykgPC0gbmFtZXMoc3JhLjIwMDEub2Muc3ApCgojIDIwMDkKY3d0LjE5LjA5IDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDkub2Muc3ApLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bMTpkW2pdLCAibHlyX3NvYyJdCiAgICB9IGVsc2UgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICB9CiAgfQogIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpCn0pCm5hbWVzKGN3dC4xOS4wOSkgPC0gbmFtZXMoc3JhLjIwMDkub2Muc3ApCgojIyBjYWxjdWxhdGUgZm1fd3RzCiMjICcxOSBkZXB0aHMKIyMgYnVsawojIDIwMDEKZm0ud3QuMTkuMDEgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDEpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDFbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjAxW1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDAxLmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5LjAxW1tpXV1bW2pdXSldCiAgICAjIGxpbmVhciBleHRyYXBvbGF0aW9uIGZvciBmaWxsaW5nIDIwLTMwY20gZm0gZGF0YQogICAgZm1fMV8zMCA8LSBkZiRmbVsxOjMwXSAjIDAtMzBjbSBmbQogICAgaWYobGVuZ3RoKHdoaWNoKGlzLm5hKGZtXzFfMzApKSkgPiAwKSB7CiAgICAgaXggPC0gd2hpY2goaXMubmEoZm1fMV8zMCkpCiAgICAgaXgubWluIDwtIG1pbihpeCkgIyBmaXJzdCBpcy5uYShmbSkKICAgICBtIDwtIGZtXzFfMzBbaXgubWluLTFdLWZtXzFfMzBbaXgubWluLTJdICMgc2xvcGUgYXQgbGFzdCB0d28gbWVhc3VyZW1lbnQgcG9pbnRzCiAgICAgZm9yKGkgaW4gaXgubWluOjMwKSB7CiAgICAgIGZtXzFfMzBbaV0gPC0gZm1fMV8zMFtpIC0gMV0gKyBtIAogICAgIH0KICAgICBkZiRmbVsxOjMwXSA8LSBmbV8xXzMwIAogICAgfQogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCiAgfSkKfSkKbmFtZXMoZm0ud3QuMTkuMDEpIDwtIG5hbWVzKGN3dC4xOS4wMSkKCiMgJzAxIGluYwpmbS53dC4xOS4wMS5pbmMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDEuYXZnKSwgZnVuY3Rpb24oaikgewogIGxhcHBseShzcmEuMjAwMS5pbmMuZm0uc3BbW2pdXSwgZnVuY3Rpb24oZm0pIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjAxLmF2Z1tbal1dWzE6MzBdKQogICAgIyBsaW5lYXIgZXh0cmFwb2xhdGlvbiBmb3IgZmlsbGluZyAyMC0zMGNtIGZtIGRhdGEKICAgIGlmIChsZW5ndGgoZm0pID49IDMwKSB7CiAgICAgIGZtXzFfMzAgPC0gZm1bMTozMF0gIyAwLTMwY20gZm0KICAgIH0gZWxzZSB7CiAgICAgIGZtXzFfMzAgPC0gcmVwKE5BLCAzMCkKICAgICAgZm1fMV8zMFsxOmxlbmd0aChmbSldIDwtIGZtCiAgICAgICMgZmlyc3QgaXMubmEoZm0pCiAgICAgIGl4Lm1pbiA8LSBtaW4od2hpY2goaXMubmEoZm1fMV8zMCkpKQogICAgICAjIHNsb3BlIGF0IGxhc3QgdHdvIG1lYXN1cmVtZW50IHBvaW50cwogICAgICBtIDwtIGZtXzFfMzBbaXgubWluIC0gMV0gLSBmbV8xXzMwW2l4Lm1pbiAtIDJdCiAgICAgIGZvcih4IGluIGl4Lm1pbjozMCkgewogICAgICAgIGZtXzFfMzBbeF0gPC0gZm1fMV8zMFt4IC0gMV0gKyBtCiAgICAgIH0KICAgIH0KICAgIGRmJGZtWzE6MzBdIDwtIGZtXzFfMzAgCiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogICAgcmV0dXJuKGRmKQogIH0pCn0pCm5hbWVzKGZtLnd0LjE5LjAxLmluYykgPC0gbmFtZXMoY3d0LjE5LjAxLmF2ZykKCiMgMjAwOQpmbS53dC4xOS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wOSksIGZ1bmN0aW9uKGkpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGN3dCA9IGN3dC4xOS4wOVtbaV1dKQogIGRmJGZtIDwtIHNyYS4yMDA5LmZtLnNwW1tpXV1bWyJ2YXIuMWNtIl1dWzE6bGVuZ3RoKGN3dC4xOS4wOVtbaV1dKV0KICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKfSkKbmFtZXMoZm0ud3QuMTkuMDkpIDwtIG5hbWVzKGN3dC4xOS4wOSkKCiMjIGNhbGN1bGF0ZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGZtIGZvciBlYWNoIGludGVydmFsCiMjICcxOSBkZXB0aHMKIyAyMDAxCiMgY2FsY3VsYXRlIHdlaWdodGVkIHNwbGluZSB2YWx1ZXMgZm9yIGVhY2ggcHJvZmlsZSByZXAKc3JhLjE5LjAxLnJlcC5scyA8LSBmbS53dC4xOS4wMQpzcmEuMTkuMDEucmVwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIHNyYS4xOS4wMS5yZXAubHNbW2ldXSA8LSBsYXBwbHkoc2VxX2Fsb25nKGZtLnd0LjE5LjAxW1tpXV0pLCBmdW5jdGlvbih4KSB7CiAgICBkIDwtIHNyYS4yMDE5LnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMTkuMDFbW2ldXVtbeF1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wMVtbaV1dW1t4XV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChmKSkgCiAgfSl9KQpzcmEuMTkuMDEucmVwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLnJlcC5scyksIGZ1bmN0aW9uKGkpIHsKICBuYW1lcyhzcmEuMTkuMDEucmVwLmxzW1tpXV0pIDwtIG5hbWVzKGN3dC4xOS4wMVtbaV1dKQogIHJldHVybihzcmEuMTkuMDEucmVwLmxzW1tpXV0pCn0pCm5hbWVzKHNyYS4xOS4wMS5yZXAubHMpIDwtIG5hbWVzKGZtLnd0LjE5LjAxKQpzYXZlKHNyYS4xOS4wMS5yZXAubHMsIGZpbGUgPSAic3JhLjE5LjAxLnJlcC5scy5SRGF0YSIpCgojIGF2ZXJhZ2UgcmVwcwpzcmEuMTkuMDEubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZm0gPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEucmVwLmxzW1tpXV1bWzFdXSksIGZ1bmN0aW9uKHopIHsKICAgIGRhdGEuZnJhbWUoZm1fMDFfbWVhbiA9IG1lYW4oc2FwcGx5KHNyYS4xOS4wMS5yZXAubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgZm1fMDFfc2QgPSBzZChzYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpKQogICAgfSkKICByZXR1cm4oYmluZF9yb3dzKGZtKSkKfSkKbmFtZXMoc3JhLjE5LjAxLmxzKSA8LSBuYW1lcyhmbS53dC4xOS4wMSkKCiMjICcwMSBpbmMKc3JhLjE5LjAxLmluYy5scyA8LSBsYXBwbHkoZm0ud3QuMTkuMDEuaW5jLCBmdW5jdGlvbihscykgewogIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gYygxMCwgMjAsIDMwKQogICAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZGZbMTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGRmWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QoZikpIAogIH0pfSkKCiMgMjAwOQpzcmEuMTkuMDkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wOVtbaV1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICB9IGVsc2UgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjA5W1tpXV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgIH0KICB9CiAgcmV0dXJuKGNiaW5kKHNyYS4yMDE5LnN1bS5sc1tbaV1dLCBmbV8wOSA9IHVubGlzdChmKSkpCn0pCm5hbWVzKHNyYS4xOS4wOS5scykgPC0gbmFtZXMoc3JhLjE5LjAxLmxzKQoKIyBjb21iaW5lCnNyYS4xOS4wMS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5scyksIGZ1bmN0aW9uKGkpIHsKICBkYXRhLmZyYW1lKHNyYS4xOS4wMS5sc1tbaV1dLCBzcmEuMTkuMDkubHNbW2ldXSkKfSkKbmFtZXMoc3JhLjE5LjAxLjA5LmxzKSA8LSBuYW1lcyhzcmEuMTkuMDEubHMpCgojIyBjcmVhdGUgdGlkeSBjb21iaW5lZCAnMDEsICcwOSwgJzE5IGRhdGEgZnJhbWUKc3JhLjE5LjAxLjA5LmRmIDwtIGJpbmRfcm93cyhzcmEuMTkuMDEuMDkubHMpCnNyYS4xOS4wMS4wOSA8LSBzcmEuMTkuMDEuMDkuZGZbLCBubXNdCnNyYS4xOS4wMS4wOSA8LSByYmluZChkYXRhLmZyYW1lKHNyYS4xOS4wMS4wOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMTkuMDEuMDkuZGYkZm1fMDFfbWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBzcmEuMTkuMDEuMDkuZGYkZm1fMDFfc2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwMSkpLAogICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHNyYS4xOS4wMS4wOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwOSkpLAogICAgICAgICAgICAgICAgICAgICBjYmluZChzcmEuMTkuMDEuMDksIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAxOSkpKQoKIyBjYWxjIGQxNGMgZnJvbSBmbQpzcmEuMTkuMDEuMDkkZDE0YyA8LSBjYWxjXzE0YyhzcmEuMTkuMDEuMDkkZm0sIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4xOS4wMS4wOSRZZWFyKSkpCnNyYS4xOS4wMS4wOSRkMTRjX3NkIDwtIGFicyhzcmEuMTkuMDEuMDkkZDE0YyAtIGNhbGNfMTRjKHNyYS4xOS4wMS4wOSRmbSArIHNyYS4xOS4wMS4wOSRmbV9zZCwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjE5LjAxLjA5JFllYXIpKSkpCnNhdmUoc3JhLjE5LjAxLjA5LCBmaWxlID0gInNyYS4xOS4wMS4wOS5SRGF0YSIpCmBgYAoKYGBge3IgY3d0LTE5LTAxLTBfMzBjbX0KIyMjIyAwLTMwY20KIyMjIGJ1bGsKIyMgMjAxOQojIFNPQyB3ZWlnaHRzCmN3dC4xOV8zMCA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDE5Lm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGxhcHBseShzcmEuMjAxOS5vYy5zcFtbaV1dLCBmdW5jdGlvbihkZikgewogICAgZCA8LSAzMAogICAgYyA8LSBkZlsxOmQsICJseXJfc29jIl0KICAgIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKGMpKSkpCiAgfSkKfSkKbmFtZXMoY3d0LjE5XzMwKSA8LSBuYW1lcyhzcmEuMjAxOS5vYy5zcCkKIyBGTSB3dHMKZm0ud3QuMTlfMzAgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTlfMzApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTlfMzBbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5XzMwW1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDE5LmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjE5XzMwW1tpXV1bW2pdXSldCiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KSAKbmFtZXMoZm0ud3QuMTlfMzApIDwtIG5hbWVzKGN3dC4xOV8zMCkKIyBzdW1tYXJpemUgb3ZlciAwLTMwY20Kc3JhLjE5LnJlcC4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKDE6OSksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGZtLnd0LjE5XzMwW1tpXV0pLCBmdW5jdGlvbih4KSB7CiAgICBkIDwtIDMwCiAgICBmIDwtIHN1bShmbS53dC4xOV8zMFtbaV1dW1t4XV1bMTpkLCAiZm1fd3QiXSkKICAgIHJldHVybih1bmxpc3QoZikpIAogIH0pCn0pCm5hbWVzKHNyYS4xOS5yZXAuMzAubHMpIDwtIG5hbWVzKGZtLnd0LjE5XzMwKQpzcmEuMTkuYXZnLjMwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMTkuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIGZtIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LnJlcC4zMC5sc1tbaV1dW1sxXV0pLCBmdW5jdGlvbih6KSB7CiAgICBkYXRhLmZyYW1lKGZtXzE5X21lYW4gPSBtZWFuKHNhcHBseShzcmEuMTkucmVwLjMwLmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgIGZtXzE5X3NkID0gc2Qoc2FwcGx5KHNyYS4xOS5yZXAuMzAubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSkKICAgIH0pCiAgcmV0dXJuKGJpbmRfcm93cyhmbSkpCn0pCm5hbWVzKHNyYS4xOS5hdmcuMzAubHMpIDwtIG5hbWVzKGZtLnd0LjE5XzMwKQoKIyMgMjAwMQojIFNPQyB3ZWlnaHRzCmN3dC4wMV8zMCA8LSBsYXBwbHkoc3JhLjIwMDEub2Muc3AsIGZ1bmN0aW9uKGxzKSB7CiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgZCA8LSAzMAogICAgYyA8LSBkZlsxOmQsICJseXJfc29jIl0KICAgIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKGMpKSkpCiAgfSkKfSkKbmFtZXMoY3d0LjAxXzMwKSA8LSBuYW1lcyhzcmEuMjAwMS5vYy5zcCkKIyBGTSB3dHMKZm0ud3QuMDFfMzAgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDFfMzApLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDFfMzBbW2ldXSksIGZ1bmN0aW9uKGopIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjAxXzMwW1tpXV1bW2pdXSkKICAgIGRmJGZtIDwtIHNyYS4yMDAxLmZtLnNwW1tpXV1bW2pdXVtbInZhci4xY20iXV1bMTpsZW5ndGgoY3d0LjAxXzMwW1tpXV1bW2pdXSldCiAgICAjIGxpbmVhciBleHRyYXBvbGF0aW9uIGZvciBmaWxsaW5nIDIwLTMwY20gZm0gZGF0YQogICAgZm1fMV8zMCA8LSBkZiRmbVsxOjMwXSAjIDAtMzBjbSBmbQogICAgaWYobGVuZ3RoKHdoaWNoKGlzLm5hKGZtXzFfMzApKSkgPiAwKSB7CiAgICAgaXggPC0gd2hpY2goaXMubmEoZm1fMV8zMCkpCiAgICAgaXgubWluIDwtIG1pbihpeCkgIyBmaXJzdCBpcy5uYShmbSkKICAgICBtIDwtIGZtXzFfMzBbaXgubWluLTFdLWZtXzFfMzBbaXgubWluLTJdICMgc2xvcGUgYXQgbGFzdCB0d28gbWVhc3VyZW1lbnQgcG9pbnRzCiAgICAgZm9yKGkgaW4gaXgubWluOjMwKSB7CiAgICAgIGZtXzFfMzBbaV0gPC0gZm1fMV8zMFtpIC0gMV0gKyBtIAogICAgIH0KICAgICBkZiRmbVsxOjMwXSA8LSBmbV8xXzMwIAogICAgfQogICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCiAgfSkKfSkgCm5hbWVzKGZtLnd0LjAxXzMwKSA8LSBuYW1lcyhjd3QuMDFfMzApCiMgc3VtbWFyaXplIG92ZXIgMC0zMGNtCnNyYS4wMS5yZXAuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZygxOjkpLCBmdW5jdGlvbihpKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhmbS53dC4wMV8zMFtbaV1dKSwgZnVuY3Rpb24oeCkgewogICAgZCA8LSAzMAogICAgZiA8LSBzdW0oZm0ud3QuMDFfMzBbW2ldXVtbeF1dWzE6ZCwgImZtX3d0Il0pCiAgICByZXR1cm4odW5saXN0KGYpKSAKICB9KQp9KQpuYW1lcyhzcmEuMDEucmVwLjMwLmxzKSA8LSBuYW1lcyhmbS53dC4wMV8zMCkKc3JhLjAxLmF2Zy4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKDE6OSksIGZ1bmN0aW9uKGkpIHsKICBmbSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4wMS5yZXAuMzAubHNbW2ldXVtbMV1dKSwgZnVuY3Rpb24oeikgewogICAgZGF0YS5mcmFtZShmbV8wMV9tZWFuID0gbWVhbihzYXBwbHkoc3JhLjAxLnJlcC4zMC5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICBmbV8wMV9zZCA9IHNkKHNhcHBseShzcmEuMDEucmVwLjMwLmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSkpCiAgICB9KQogIHJldHVybihiaW5kX3Jvd3MoZm0pKQp9KQpuYW1lcyhzcmEuMDEuYXZnLjMwLmxzKSA8LSBuYW1lcyhmbS53dC4wMV8zMCkKCiMjIyBpbmMKIyMgMjAxOQojIFNPQyB3ZWlnaHRzIChzaXRlIGF2ZXJhZ2UpCmN3dC4xOV8zMC5hdmcgPC0gbGFwcGx5KGN3dC4xOV8zMCwgZnVuY3Rpb24obHMpIHsKICBhcHBseShiaW5kX3Jvd3MobHMpLCAxLCBtZWFuKQp9KQojIEZsdXggd2VpZ2h0cyAoc2l0ZSBhdmVyYWdlKQoKY3d0LjE5XzMwLmF2ZyA8LSBsYXBwbHkoY3d0LjE5XzMwLCBmdW5jdGlvbihscykgewogIGFwcGx5KGJpbmRfcm93cyhscyksIDEsIG1lYW4pCn0pCiMgRk0gd2VpZ2h0cwpmbS53dC4xOS4zMC5pbmMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTlfMzAuYXZnKSwgZnVuY3Rpb24oaikgewogIGxhcHBseShzcmEuMjAxOS5pbmMuZm0uc3BbW2pdXSwgZnVuY3Rpb24oZm0pIHsKICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5XzMwLmF2Z1tbal1dKQogICAgZGYkZm0gPC0gZm0KICAgIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQogIH0pCn0pIApuYW1lcyhmbS53dC4xOS4zMC5pbmMpIDwtIG5hbWVzKGN3dC4xOV8zMC5hdmcpCiMgc3VtbWFyaXplIG92ZXIgMC0zMGNtCnNyYS4xOS4zMC5pbmMubHMgPC0gbGFwcGx5KGZtLnd0LjE5LjMwLmluYywgZnVuY3Rpb24obHMpIHsKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSBzdW0oZGYkZm1fd3QpKQogIG5hbWVzKGxzKSA8LSBjKCJmbV8xOV9tZWFuIiwgImZtXzE5X21pbiIsICJmbV8xOV9tYXgiKQogIHJldHVybihkYXRhLmZyYW1lKGJpbmRfcm93cyhscykpKQp9KQpuYW1lcyhzcmEuMTkuMzAuaW5jLmxzKSA8LSBuYW1lcyhjd3QuMTlfMzAuYXZnKQoKIyMgMjAwMQojIFNPQyB3ZWlnaHRzIChzaXRlIGF2ZXJhZ2UpCmN3dC4wMV8zMC5hdmcgPC0gbGFwcGx5KGN3dC4wMV8zMCwgZnVuY3Rpb24obHMpIHsKICBhcHBseShiaW5kX3Jvd3MobHMpLCAxLCBtZWFuKQp9KQojIEZNIHdlaWdodHMgKGNzdG9jayB3ZWlnaHRpbmcpCmZtLnd0LjAxLjMwLmluYyA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4wMV8zMC5hdmcpLCBmdW5jdGlvbihqKSB7CiAgbGFwcGx5KHNyYS4yMDAxLmluYy5mbS5zcFtbal1dLCBmdW5jdGlvbihmbSkgewogICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMDFfMzAuYXZnW1tqXV0pCiAgICBkZiRmbSA8LSBmbVsxOmxlbmd0aChjd3QuMDFfMzAuYXZnW1tqXV0pXQogICAgIyBsaW5lYXIgZXh0cmFwb2xhdGlvbiBmb3IgZmlsbGluZyAyMC0zMGNtIGZtIGRhdGEKICAgIGZtXzFfMzAgPC0gZGYkZm1bMTozMF0gIyAwLTMwY20gZm0KICAgIGlmKGxlbmd0aCh3aGljaChpcy5uYShmbV8xXzMwKSkpID4gMCkgewogICAgIGl4IDwtIHdoaWNoKGlzLm5hKGZtXzFfMzApKQogICAgIGl4Lm1pbiA8LSBtaW4oaXgpICMgZmlyc3QgaXMubmEoZm0pCiAgICAgbSA8LSBmbV8xXzMwW2l4Lm1pbi0xXS1mbV8xXzMwW2l4Lm1pbi0yXSAjIHNsb3BlIGF0IGxhc3QgdHdvIG1lYXN1cmVtZW50IHBvaW50cwogICAgIGZvcihpIGluIGl4Lm1pbjozMCkgewogICAgICBmbV8xXzMwW2ldIDwtIGZtXzFfMzBbaSAtIDFdICsgbSAKICAgICB9CiAgICAgZGYkZm1bMTozMF0gPC0gZm1fMV8zMCAKICAgIH0KICAgIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQogIH0pCn0pIApuYW1lcyhmbS53dC4wMS4zMC5pbmMpIDwtIG5hbWVzKGN3dC4wMV8zMC5hdmcpCiMgc3VtbWFyaXplIG92ZXIgMC0zMGNtCnNyYS4wMS4zMC5pbmMubHMgPC0gbGFwcGx5KGZtLnd0LjAxLjMwLmluYywgZnVuY3Rpb24obHMpIHsKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSBzdW0oZGYkZm1fd3QpKQogIG5hbWVzKGxzKSA8LSBjKCJmbV8wMV9tZWFuIiwgImZtXzAxX21pbiIsICJmbV8wMV9tYXgiKQogIHJldHVybihkYXRhLmZyYW1lKGJpbmRfcm93cyhscykpKQp9KQpuYW1lcyhzcmEuMDEuMzAuaW5jLmxzKSA8LSBuYW1lcyhjd3QuMDFfMzAuYXZnKQoKIyMgZGYgZm9yIGxpbmVhciBtb2RlbGluZwojIGJ1bGsKc3JhLmJsay5yZXAuMzAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMDEucmVwLjMwLmxzKSwgZnVuY3Rpb24oaSkgewogIGJsay4wMSA8LSBkYXRhLmZyYW1lKGZtX2JsayA9IGRvLmNhbGwocmJpbmQsIHNyYS4wMS5yZXAuMzAubHNbW2ldXSksCiAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMDEpCiAgYmxrLjE5IDwtIGRhdGEuZnJhbWUoZm1fYmxrID0gZG8uY2FsbChyYmluZCwgc3JhLjE5LnJlcC4zMC5sc1tbaV1dKSwKICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOSkKICByYmluZChibGsuMDEsIGJsay4xOSkgJT4lCiAgICBtdXRhdGUoZDE0Y19ibGsgPSBjYWxjXzE0YyhmbV9ibGssIHllYXIpKQp9KQpuYW1lcyhzcmEuYmxrLnJlcC4zMC5scykgPC0gbmFtZXMoc3JhLjAxLjMwLmluYy5scykKc3JhLmJsay5yZXAuMzAuZGYgPC0gYmluZF9yb3dzKHNyYS5ibGsucmVwLjMwLmxzLCAuaWQgPSAiUE1lY28iKQojIGluYwppbmMuMzAuYmluZC5meCA8LSBmdW5jdGlvbihscywgeWVhcl94eCkgewogIHJiaW5kKAogICAgYmluZF9yb3dzKGxhcHBseShscywgIlsiLCAyKSwgLmlkID0gIlBNZWNvIikgJT4lCiAgICAgIHJlbmFtZShmbV9pbmMgPSBwYXN0ZTAoImZtXyIsIHllYXJfeHgsICJfbWluIikpLAogICAgYmluZF9yb3dzKGxhcHBseShscywgIlsiLCAzKSwgLmlkID0gIlBNZWNvIikgJT4lCiAgICAgIHJlbmFtZShmbV9pbmMgPSBwYXN0ZTAoImZtXyIsIHllYXJfeHgsICJfbWF4IikpKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyhwYXN0ZTAoIjIwIiwgeWVhcl94eCkpKSAlPiUKICAgIG11dGF0ZShkMTRjX2luYyA9IGNhbGNfMTRjKGZtX2luYywgeWVhcikpCn0Kc3JhLmluYy5yZXAuMzAuZGYgPC0gcmJpbmQoaW5jLjMwLmJpbmQuZngoc3JhLjAxLjMwLmluYy5scywgIjAxIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmMuMzAuYmluZC5meChzcmEuMTkuMzAuaW5jLmxzLCAiMTkiKSkKIyBjb21iaW5lCnNyYS5ibGsuaW5jLnJlcC4zMC5kZiA8LSBtZXJnZShzcmEuYmxrLnJlcC4zMC5kZiwgc3JhLmluYy5yZXAuMzAuZGYsIGJ5ID0gYygieWVhciIsICJQTWVjbyIpKQpzYXZlKHNyYS5ibGsuaW5jLnJlcC4zMC5kZiwgZmlsZSA9ICJzcmEuYmxrLmluYy5yZXAuMzAuZGYuUkRhdGEiKQoKIyMgQ29tYmluZSBtZWFuIGRhdGEgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lCiMgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIGZtIHRvIGQxNGMgYW5kIGNhbGN1bGF0aW5nIHNkCmJsay4xNGMuc2QuZnggPC0gZnVuY3Rpb24oZGYsIHllYXJfeHgpIHsKICBkYXRlIDwtIGFzLm51bWVyaWMocGFzdGUwKDIwLCB5ZWFyX3h4KSkKICBkZiRmbV91IDwtIGRmW1twYXN0ZTAoImZtXyIsIHllYXJfeHgsICJfbWVhbiIpXV0gKyBkZltbcGFzdGUwKCJmbV8iLCB5ZWFyX3h4LCAiX3NkIildXQogIGRmJGQxNGNfdSA8LSBjYWxjXzE0YyhkZiRmbV91LCBkYXRlKQogIGRmW1twYXN0ZTAoImQxNGNfIiwgIm1lYW4iKV1dIDwtIGNhbGNfMTRjKGRmW1twYXN0ZTAoImZtXyIsIHllYXJfeHgsICJfbWVhbiIpXV0sIGRhdGUpCiAgZGZbW3Bhc3RlMCgiZDE0Y18iLCAic2QiKV1dIDwtIGRmW1twYXN0ZTAoImQxNGNfIiwgIm1lYW4iKV1dIC0gZGYkZDE0Y191CiAgZGYkeWVhciA8LSBhcy5udW1lcmljKHBhc3RlMCgyMCwgeWVhcl94eCkpCiAgcmV0dXJuKGRmICU+JSBzZWxlY3QoYyhzdGFydHNfd2l0aCgiZDE0YyIpLCB5ZWFyKSkgJT4lIHNlbGVjdCgtZDE0Y191KSkKfQppbmMuMTRjLnNkLmZ4IDwtIGZ1bmN0aW9uKGRmLCB5ZWFyX3h4KSB7CiAgbmFtZXMoZGYpIDwtIGdzdWIocGFzdGUwKCJmbV8iLCB5ZWFyX3h4KSwgImQxNGMiLCBuYW1lcyhkZikpCiAgZGZfMTRjIDwtIGNhbGNfMTRjKGRmLCBhcy5udW1lcmljKHBhc3RlMCgyMCwgeWVhcl94eCkpKQogIGRmXzE0Y1tbcGFzdGUwKCJkMTRjXyIsICJzZCIpXV0gPC0gc2QoZGZfMTRjWyAsIDI6M10pCiAgZGZfMTRjJHllYXIgPC0gYXMubnVtZXJpYyhwYXN0ZTAoMjAsIHllYXJfeHgpKQogIHJldHVybihkZl8xNGNbICwgYygxLCA0OjUpXSkKfQojIHJ1biBmdW5jdGlvbnMgYW5kIGNvbWJpbmUgbGlzdHMgCiMgMC0zMGNtIGRhdGEgZnJvbSAnMDEgYW5kICcxOQpzcmEuMzAuYmxrLmluYy5scyA8LSBsYXBwbHkoCiAgbGlzdChsYXBwbHkoc3JhLjAxLjMwLmluYy5scywgaW5jLjE0Yy5zZC5meCwgeWVhcl94eCA9ICIwMSIpLCAKICAgICAgIGxhcHBseShzcmEuMTkuMzAuaW5jLmxzLCBpbmMuMTRjLnNkLmZ4LCB5ZWFyX3h4ID0gIjE5IiksCiAgICAgICBsYXBwbHkoc3JhLjAxLmF2Zy4zMC5scywgYmxrLjE0Yy5zZC5meCwgeWVhcl94eCA9ICIwMSIpLAogICAgICAgbGFwcGx5KHNyYS4xOS5hdmcuMzAubHMsIGJsay4xNGMuc2QuZngsIHllYXJfeHggPSAiMTkiKSksCiAgYmluZF9yb3dzLCAuaWQgPSAiUE1lY28iKQojIHJlZHVjZSBsaXN0IHRvIGRhdGEgZnJhbWUsIGNhbGN1bGF0ZSBkaWZmZXJlbmNlIG9mIG1lYW5zIGFuZCBzZApzcmEuMzAuYmxrLmluYy5kZiA8LSByYmluZChtZXJnZShzcmEuMzAuYmxrLmluYy5sc1tbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEuMzAuYmxrLmluYy5sc1tbM11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIlBNZWNvIiwgInllYXIiKSwgc3VmZml4ZXMgPSBjKCJfaW5jIiwgIl9ibGsiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlKHNyYS4zMC5ibGsuaW5jLmxzW1syXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYS4zMC5ibGsuaW5jLmxzW1s0XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiUE1lY28iLCAieWVhciIpLCBzdWZmaXhlcyA9IGMoIl9pbmMiLCAiX2JsayIpKSkgJT4lCiAgbXV0YXRlKGJsay5pbmMgPSBkMTRjX21lYW5fYmxrIC0gZDE0Y19tZWFuX2luYywKICAgICAgICAgYmxrLmluYy5zZCA9IHNxcnQoZDE0Y19zZF9ibGteMi8zICsgZDE0Y19zZF9pbmNeMi8yKSkKYGBgCgpgYGB7ciBwbG90LTAxLTA5LTE5LTE0Yy1wcm9maWxlc30KIApzcmEuMDEuMDkuMTkgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICAjIGZpbHRlcihZZWFyICE9ICIyMDA5IikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgbGluZXR5cGUgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IFllYXIpLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX3hfY29udGludW91cygpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMjAwMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDA5IiA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gInNvbGlkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9ICJkb3R0ZWQiKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBUaW1lIHNlcmllcyBvZiBidWxrIHNvaWwgJFxEZWx0YSReMTReQyBieSAyMDAxIGRlcHRocyAoMjAwMSwgMjAwOSwgMjAxOSBzYW1wbGVzKSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMDEgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwOSBhbmQgMjAxOSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMDEuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gCgpgYGB7ciBwbG90LTE5LTAxLTA5LTE0Yy1wcm9maWxlc30KIApzcmEuMTkuMDEuMDkgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBsaW5ldHlwZSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICAjIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDMwLCAwKSkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9ICJzb2xpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gImRvdHRlZCIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFRpbWUgc2VyaWVzIG9mIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIChzcGxpbmVkIHRvIDIwMTkgZGVwdGhzKSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMTkgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwMSBhbmQgMjAwOSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gCj4qTkI6IE9ubHkgdHdvIGRlcHRoIGludGVydmFscyB3ZXJlIG1lYXN1cmVkIGF0IHRoZSBjb29sIGFuZCBjb2xkIGFuZGVzaXRlIHNpdGVzIChtYXggZGVwdGggb2YgMjcgYW5kIDI4IGNtLCByZXNwZWN0aXZlbHkpLCBzbyBsaW5lYXIgZXh0cmFwb2xhdGlvbiAodXNpbmcgdGhlIHNsb3BlIG9mIHRoZSBsYXN0IDFjbSBzcGxpbmUtZml0dGVkIGRlcHRoIGluY3JlbWVudCkgd2FzIHVzZWQgdG8gZXh0ZW5kIHRoZSBwcm9maWxlcyB0byAzMCBjbS4qCgpgYGB7ciBwbG90LWJ5LWRlcHRoLTE0Qy10aW1lc2VyaWVzfQojIHBsb3QgaW5kaXZpZHVhbCBkZXB0aHMKIAoKIyBBdG0KYXRtLjE0YyA8LSBkYXRhLmZyYW1lKHllYXIgPSBEYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJEYXRlIl0sCiAgICAgICAgICAgICAgICAgICAgICBkMTRjID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiTkhjMTQiXSkKc2F2ZShhdG0uMTRjLCBmaWxlID0gImF0bS4xNGMuUkRhdGEiKQoKIyBidWxrIDE0QyBvdmVyIHRpbWUgZm9yIDAtMTAsIDEwLTIwLCAyMC0zMCB3LyBhdG0Kc3JhLjE5LjAxLjA5ICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogIG11dGF0ZShQTWVjb19kZXB0aCA9IHBhc3RlMChQTWVjbywgbHlyX2JvdCksCiAgICAgICAgIGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoWWVhcikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXIsIGQxNGMpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0uMTRjKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY28pLCBzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgZ3JvdXAgPSBQTWVjb19kZXB0aCwgbGluZXR5cGUgPSBkZXB0aCksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sLCAKICAgICAgICB5bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIHdpZHRoID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gIkRlcHRoIChjbSkiLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxMCIgPSAiMC0xMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwIiA9ICIxMC0yMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwIiA9ICIyMC0zMCIpLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIxMCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMCIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMCIgPSAzKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKCJZZWFyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIyMgaW5jdWJhdGlvbgojIyAyMDE5CnNyYS4yMDE5LmluYy5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNyYS4yMDE5LmluYy5scywgZnVuY3Rpb24oZGYpIHsKICBkYXRhLmZyYW1lKGRmICU+JQogICAgICAgICAgICAgICBncm91cF9ieShZZWFyLCBQTSwgRUNPLCBseXJfYm90LCBQTWVjbykgJT4lCiAgICAgICAgICAgICAgIHN1bW1hcml6ZSgKICAgICAgICAgICAgICAgICBhY3Jvc3MoLmNvbHMgPSBkMTRjLCAKICAgICAgICAgICAgICAgICAgICAgICAgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIG1pbiA9IG1pbiwgbWF4ID0gbWF4KSkpICU+JQogICAgICAgICAgICAgICByZW5hbWUoeWVhciA9IFllYXIsIGQxNGMgPSBkMTRjX21lYW4pKQp9KSkKc2F2ZShzcmEuMjAxOS5pbmMuZGYsIGZpbGUgPSAic3JhLjIwMTkuaW5jLmRmLlJEYXRhIikKIyMgMjAwMQpzcmEuMTkuMDEuaW5jLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5pbmMubHMpLCBmdW5jdGlvbihpKSB7CiAgUE1lY28gPC0gbmFtZXMoc3JhLjE5LjAxLmluYy5scylbaV0KICBkMTRjLmxzIDwtIGxhcHBseShzcmEuMTkuMDEuaW5jLmxzW1tpXV0sIGNhbGNfMTRjLCBvYnNfZGF0ZV95ID0gMjAwMSkKICBkZiA8LSBkYXRhLmZyYW1lKGQxNGMgPSBkMTRjLmxzW1sxXV0sCiAgICAgICAgICAgICAgICAgICBkMTRjX21pbiA9IGQxNGMubHNbWzJdXSwKICAgICAgICAgICAgICAgICAgIGQxNGNfbWF4ID0gZDE0Yy5sc1tbM11dLAogICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IGMoMTAsIDIwLCAzMCksCiAgICAgICAgICAgICAgICAgICBQTWVjbyA9IFBNZWNvLAogICAgICAgICAgICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICAgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSwKICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDAxKQogIHJldHVybihkZikKfSkpCiMgam9pbgpzcmEuMTkuMDEuaW5jIDwtIHJiaW5kKHNyYS4xOS4wMS5pbmMuZGYsIHNyYS4yMDE5LmluYy5kZikKCiMgcGxvdApzcmEuMTkuMDEuaW5jICU+JQogIG11dGF0ZShQTWVjb19kZXB0aCA9IHBhc3RlMChQTWVjbywgbHlyX2JvdCksCiAgICAgICAgIGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFyLCBkMTRjKSkgKwogIGdlb21fcGF0aChkYXRhID0gYXRtLjE0YykgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZWNvLCBzaGFwZSA9IGVjbyksIHNpemUgPSAzKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3JhLjIwMTkuaW5jLkwuZGYsIGFlcyhjb2xvciA9IGVjbyksIHNoYXBlID0gOCwgc2l6ZSA9IDMsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gZWNvLCBncm91cCA9IFBNZWNvKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX21pbiwgCiAgICAgICAgeW1heCA9IGQxNGNfbWF4LAogICAgICAgIGNvbG9yID0gZWNvKSwgCiAgICB3aWR0aCA9IC41KSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGRhdGEgPSBzcmEuMjAxOS5pbmMuTC5kZiwKICAgIGFlcyh5bWluID0gZDE0Y19taW4sIAogICAgICAgIHltYXggPSBkMTRjX21heCwKICAgICAgICBjb2xvciA9IGVjbyksIAogICAgd2lkdGggPSAuNSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNDAsIDE3MCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHBtKSwgY29scyA9IHZhcnMoZGVwdGgpKSArCiAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKCJZZWFyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3QgaW5jIGFuZCBidWxrIHRvZ2V0aGVyLCBieSBkZXB0aApzcmEudHMuYWxsIDwtIHNyYS4xOS4wMS4wOSAlPiUKICBmaWx0ZXIobHlyX2JvdCA8IDMxKSAlPiUKICBzZWxlY3QoWWVhciwgUE0sIEVDTywgUE1lY28sIGx5cl9ib3QsIGQxNGMsIGQxNGNfc2QpICU+JQogIG11dGF0ZShUeXBlID0gImJ1bGsiLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihZZWFyKSkpICU+JQogIHNlbGVjdCgtZDE0Y19zZCwgLVllYXIpICU+JQogIGJpbmRfcm93cyguLAogICAgICAgICAgICBzcmEuMTkuMDEuaW5jICU+JQogICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBQTSwgRUNPLCBQTWVjbywgbHlyX2JvdCwgZDE0YywgZDE0Y19taW4sIGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICByZW5hbWUoZDE0Y19sID0gZDE0Y19taW4sCiAgICAgICAgICAgICAgICAgICAgIGQxNGNfdSA9IGQxNGNfbWF4KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoVHlwZSA9ICJpbmMiKQogICkgJT4lCiAgbXV0YXRlKGRlcHRoID0gZmFjdG9yKGx5cl9ib3QpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvVHlwZSA9IHBhc3RlMChlY28sICIgKCIsIFR5cGUsICIpIikpCgojIFBsb3QgYnkgZGVwdGgKcGxvdC50cy5meCA8LSBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgZmlsdGVyKGQxNGMgPiAtMjAwKSAlPiUKICAgIGZpbHRlcih5ZWFyICE9IDIwMDkpICU+JQogICAgZ2dwbG90KC4sIGFlcyh5ZWFyLCBkMTRjKSkgKwogICAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0uMTRjKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHBtLCBzaGFwZSA9IGVjb1R5cGUpLCBzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBsaW5ldHlwZSA9IFR5cGUpLCBhbHBoYSA9IDAuMykgKwogICAgZ2VvbV9lcnJvcmJhcigKICAgICAgYWVzKHltaW4gPSBkMTRjX2wsIAogICAgICAgICAgeW1heCA9IGQxNGNfdSwKICAgICAgICAgIGNvbG9yID0gcG0pLCAKICAgICAgd2lkdGggPSAuNSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoaW5jKSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGluYykiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChpbmMpIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoYnVsaykiID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoYnVsaykiID0gMTcpKSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogICAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHhsYWIoIlllYXIiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KCiMgcGxvdHMKbGFwcGx5KHNwbGl0KHNyYS50cy5hbGwsIHNyYS50cy5hbGwkZGVwdGgpLCBwbG90LnRzLmZ4KQoKIyAjIHRvIHNhdmUKIyBmb3IoaSBpbiAxOjMpIGdnc2F2ZShwYXN0ZTAoaSwgIi5wZGYiKSwgbGFwcGx5KHNwbGl0KHNyYS50cy5hbGwsIHNyYS50cy5hbGwkZGVwdGgpLCBwbG90LnRzLmZ4KVtbaV1dKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gQ2hhbmdlIGluICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIChwYW5lbCBhKSBhbmQgcmVzcGlyZWQgQ09+Mn4gKHBhbmVsIGIpIG92ZXIgdGltZSByZWxhdGl2ZSB0byB0aGUgYXRtb3NwaGVyZSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMTkgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwMSBhbmQgMjAwOSAoYnVsayBvbmx5KSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMTkuIEVycm9yIGJhcnMgZm9yIGJ1bGsgc2FtcGxlcyBpbiBwYW5lbCAoYSkgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KTsgZXJyb3IgYmFycyBmb3IgaW5jdWJhdGlvbiBzYW1wbGVzIGluIHBhbmVsIChiKSBzaG93IHRoZSB2YWx1ZXMgb2YgdGhlIHR3byByZXBzLCB3aGlsZSB0aGUgcG9pbnQgcmVwcmVzZW50cyB0aGUgbWVhbi4gCj4qTkI6IE9ubHkgdHdvIGRlcHRoIGludGVydmFscyB3ZXJlIG1lYXN1cmVkIGF0IHRoZSBjb29sIGFuZCBjb2xkIGFuZGVzaXRlIHNpdGVzIChtYXggZGVwdGggb2YgMjcgYW5kIDI4IGNtLCByZXNwZWN0aXZlbHkpLCBzbyBsaW5lYXIgZXh0cmFwb2xhdGlvbiAodXNpbmcgdGhlIHNsb3BlIG9mIHRoZSBsYXN0IDFjbSBzcGxpbmUtZml0dGVkIGRlcHRoIGluY3JlbWVudCkgd2FzIHVzZWQgdG8gZXh0ZW5kIHRoZSBwcm9maWxlcyB0byAzMCBjbS4qCgpgYGB7ciBtaW4tZGF0YS1yYXMxOH0KIyBsb2FkIGRhdGEKcmFzMTguZnJjIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9qZWZmL3NyYS10cy9kYXRhL2V4dGVybmFsL3NyYV9yYXNfc3VtL3NpZXJyYV9kYXRhX3N1bW1hcnlfMjAyMC54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiMjAwOV9mcmFjdGlvbl9kYXRhIikKCiMgc2VsZWN0IG9ubHkgbWluIGNvbHMgYW5kIHBpdm90IGxvbmdlcgpyYXMxOF8yIDwtIHJhczE4LnN1bSAlPiUKICBzZWxlY3QoYEZlZCAoZy9rZylgLCBgRmVvIChnL2tnKWAsIGBBbG8gKGcva2cpYCwgYEFscCAoZy9rZylgLCBgdG9wIG1pbmVyYWxgLCBgYm90dG9tIG1pbmVyYWxgLCBwcm9fbmFtZSkgJT4lIAogIHJlbmFtZShseXJfdG9wID0gYHRvcCBtaW5lcmFsYCwKICAgICAgICAgbHlyX2JvdCA9IGBib3R0b20gbWluZXJhbGApICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgRmVkIChnL2tnKWAsIAogICAgICAgICAgICAgICAgICAgICAgICBgRmVvIChnL2tnKWAsIAogICAgICAgICAgICAgICAgICAgICAgICBgQWxvIChnL2tnKWAsIAogICAgICAgICAgICAgICAgICAgICAgICBgQWxwIChnL2tnKWApLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAibWlucyIsIHZhbHVlc190byA9ICJjb25jIikgJT4lCiAgZGF0YS5mcmFtZSgpCgojIENhbGN1bGF0ZSBtaW4gc3RvY2tzCnJhczE4XzMgPC0gcmFzMTguc3VtICU+JQogIHNlbGVjdChgRmVkIChnL2tnKWAsIGBGZW8gKGcva2cpYCwgYEFsbyAoZy9rZylgLCBgQWxwIChnL2tnKWAsIGB0b3AgbWluZXJhbGAsIGBib3R0b20gbWluZXJhbGAsIHByb19uYW1lLCBCRF9nX2NtXzMsIFNvaWxfZmluZWZyYWN0aW9uLCBUaGlja25lc3NfY20pICU+JSAKICByZW5hbWUobHlyX3RvcCA9IGB0b3AgbWluZXJhbGAsCiAgICAgICAgIGx5cl9ib3QgPSBgYm90dG9tIG1pbmVyYWxgKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoYEZlZCAoZy9rZylgLCAKICAgICAgICAgICAgICAgICAgICAgICAgYEZlbyAoZy9rZylgLCAKICAgICAgICAgICAgICAgICAgICAgICAgYEFsbyAoZy9rZylgLCAKICAgICAgICAgICAgICAgICAgICAgICAgYEFscCAoZy9rZylgKSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIm1pbnMiLCB2YWx1ZXNfdG8gPSAiY29uYyIpICU+JQogIG11dGF0ZShtYXNzID0gVGhpY2tuZXNzX2NtICogQkRfZ19jbV8zICogU29pbF9maW5lZnJhY3Rpb24gKiAxMCwKICAgICAgICAgbWluX3N0b2NrID0gY29uYyAqIG1hc3MgKiAxMF4tMikgJT4lCiAgZGF0YS5mcmFtZSgpCnJhczE4XzMubHMgPC0gbGFwcGx5KHNwbGl0KHJhczE4XzMsIHJhczE4XzMkbWlucyksIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIHggPC0geFtvcmRlcih4JGx5cl9ib3QpLCBdCiAgICAjIGNhbGMgY210diBtaW4gc3RvY2sKICAgIHgkbWluX3N0b2NrX2NtdHYgPC0gTkEKICAgIGZvcihpIGluIHNlcV9hbG9uZyh4JGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIHgkbWluX3N0b2NrX2NtdHZbaV0gPC0geCRtaW5fc3RvY2tbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JG1pbl9zdG9ja19jbXR2W2ldIDwtIHgkbWluX3N0b2NrW2ldICsgeCRtaW5fc3RvY2tfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICB4JG1hc3NfY210diA8LSBOQQogICAgZm9yKGkgaW4gc2VxX2Fsb25nKHgkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgeCRtYXNzX2NtdHZbaV0gPC0geCRtYXNzW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRtYXNzX2NtdHZbaV0gPC0geCRtYXNzW2ldICsgeCRtYXNzX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKfSkKcmFzMThfMy5zcC5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHJhczE4XzMubHMsIGZ1bmN0aW9uKGxzKSB7CiAgYmluZF9yb3dzKGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gIm1pbl9zdG9ja19jbXR2IikKICAgIHJldHVybih4Lm1wcyR2YXIuMWNtWzMwXSkKICB9KSwgLmlkID0gInByb19uYW1lIikgJT4lCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAicHJvX25hbWUiLCB2YWx1ZXNfdG8gPSAibWluX3N0b2NrX2NtdHYiKQp9KSwgLmlkID0gIm1pbiIpICU+JQogIG11dGF0ZShtaW4gPSBpZmVsc2UobWluID09ICJBbG8gKGcva2cpIiwgIkFsX294IiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtaW4gPT0gIkFscCAoZy9rZykiLCAiQWxfcHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtaW4gPT0gIkZlZCAoZy9rZykiLCAiRmVfZGMiLCAiRmVfb3giKSkpLAogICAgICAgICBQTWVjbyA9IHN1YnN0cihwcm9fbmFtZSwgMSwgNCkpICU+JQogIHNlbGVjdCgtcHJvX25hbWUpCgojIG1hc3Mtd2VpZ2h0ZWQgY29uY2VudHJhdGlvbgpyYXMxOF80LnNwLmxzIDwtIGxhcHBseShyYXMxOF8zLmxzLCBmdW5jdGlvbihscykgewogIGNvbmMgPC0gdW5saXN0KGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gImNvbmMiKQogICAgZGYgPC0gZGF0YS5mcmFtZShjb25jID0geC5tcHMkdmFyLjFjbVsxOjMwXSwKICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IHNlcSgxLCAzMCksCiAgICAgICAgICAgICAgICAgICAgIHByb19uYW1lID0gc3Vic3RyKHgubXBzJGlkY29sLCAxLCA0KSkKICAgIHJldHVybihzcGxpdChkZiwgZGYkcHJvX25hbWUpKQogICAgfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQogIG1hc3MgPC0gdW5saXN0KGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICB4IDwtIGxzW1tpXV1bICwgYygibHlyX2JvdCIsICJtYXNzX2NtdHYiKV0KICAgIHQwIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSAxLCBuY29sID0gbmNvbCh4KSkpCiAgICBuYW1lcyh0MCkgPC0gbmFtZXMoeCkKICAgIHQwIDwtIDAKICAgIHggPC0gcmJpbmQodDAsIHgpCiAgICBzcCA8LSBzcGxpbmUoeCwgbWV0aG9kID0gImh5bWFuIikgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCkgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICAgIHN0ZCA8LSBzZXEoMCwgMzApICMgZGVwdGggaW4gY20KICAgIHNwIDwtIHByZWRpY3Qoc3Auc3MsIHN0ZCkgCiAgICBkZiA8LSBkYXRhLmZyYW1lKHNwKQogICAgY29sbmFtZXMoZGYpIDwtIGMoImx5cl9ib3QiLCAibWFzc19jbXR2IikKICAgIGRmJHByb19uYW1lIDwtIHN1YnN0cihuYW1lcyhscylbaV0sIDEsIDQpCiAgICBkZiA8LSBkZlstMSwgXQogICAgcmV0dXJuKHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkpCiAgfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQogIHJldHVybihtYXBwbHkobWVyZ2UsCiAgICAgICAgICAgICAgICBtYXNzLAogICAgICAgICAgICAgICAgY29uYywKICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpKQp9KQoKIyBjYWxjdWxhdGUgbWFzcy13ZWlnaHRlZCBjb25jIGZvciAwLTMwY20KcmFzMThfNC5zcC5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHJhczE4XzQuc3AubHMsIGZ1bmN0aW9uKGxzKSB7CiAgYmluZF9yb3dzKGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIGRmW29yZGVyKGRmJGx5cl9ib3QpLCBdCiAgICBkZiRtYXNzIDwtIE5BCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGRmJG1hc3MpKSB7CiAgICAgIGlmIChpID09IDEpIHsKICAgICAgICBkZiRtYXNzW2ldIDwtIGRmJG1hc3NfY210dltpXQogICAgICB9IGVsc2UgewogICAgICAgIGRmJG1hc3NbaV0gPC0gZGYkbWFzc19jbXR2W2ldIC0gZGYkbWFzc19jbXR2W2ktMV0KICAgICAgfQogICAgfQogICAgZGYkbWFzc193dCA8LSBkZiRtYXNzL3N1bShkZiRtYXNzKQogICAgZGYkY29uY18zMF93dGQgPC0gZGYkbWFzc193dCAqIGRmJGNvbmMKICAgIHJldHVybihzdW0oZGYkY29uY18zMF93dGQpKQogIH0pLCAuaWQgPSAicHJvX25hbWUiKQp9KSwgLmlkID0gIm1pbiIpICU+JQogIHBpdm90X2xvbmdlcighbWluLCBuYW1lc190byA9ICJQTWVjbyIsIHZhbHVlc190byA9ICJjb25jIikgJT4lCiAgbXV0YXRlKG1pbiA9IGlmZWxzZShtaW4gPT0gIkFsbyAoZy9rZykiLCAiQWxfb3giLCAKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtaW4gPT0gIkFscCAoZy9rZykiLCAiQWxfcHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShtaW4gPT0gIkZlZCAoZy9rZykiLCAiRmVfZGMiLCAiRmVfb3giKSkpKQoKIyBtZXJnZSB3LyAxNEMgZGF0YQpzcmEuYWxsLjMwLm1pbi5jb25jLnd0ZCA8LSBtZXJnZShzcmEuMzAuYmxrLmluYy5kZiwgcmFzMThfNC5zcC5kZiwgYnkgPSAiUE1lY28iKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2Uoc3Vic3RyKFBNZWNvLCAxLCAyKSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjbywgMSwgMikgPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY28gPSBpZmVsc2Uoc3Vic3RyKFBNZWNvLCAzLCA0KSA9PSAicHAiLCAid2FybSIsIAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjbywgMywgNCkgPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSkKc2F2ZShzcmEuYWxsLjMwLm1pbi5jb25jLnd0ZCwgZmlsZSA9ICJzcmEuYWxsLjMwLm1pbi5jb25jLnd0ZC5SRGF0YSIpCgojIHNwbGluZSBmaXRzCiMgKHNob3VsZCBiZSBtYXNzLXdlaWdodGVkLi4uKQojIGFsc28gY2FsY3VsYXRlIGZvciAwLTMwY20KcmFzMTguc3BsaXQgPC0gc3BsaXQocmFzMThfMiwgcmFzMThfMiRtaW5zKQpyYXMxOC5zcCA8LSBsYXBwbHkocmFzMTguc3BsaXQsIGZ1bmN0aW9uKGRmKSB7CiAgbHMgPC0gbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJjb25jIiwgZCA9IHQoc2VxKDAsIDEwMCwgMTApKSkKICAgIHJldHVybih4Lm1wcyR2YXIuc3RkKQogIH0pCiAgbmFtZXMobHMpIDwtIHVuaXF1ZShkZiRwcm9fbmFtZSkKICByZXR1cm4obHMpCn0pCm5hbWVzKHJhczE4LnNwKSA8LSBjKCJBbF9veCIsICJBbF9weSIsICJGZV9kYyIsICJGZV9veCIpCnJhczE4LnNwLmRmIDwtIGRhdGEuZnJhbWUocmVkdWNlKGxhcHBseShzZXFfYWxvbmcocmFzMTguc3ApLCBmdW5jdGlvbihpKSB7CiAgICBkZiA8LSBkYXRhLmZyYW1lKHQoYmluZF9yb3dzKHJhczE4LnNwW1tpXV0pKSkKICAgIG5hbWVzKGRmKSA8LSB1bmlxdWUocmFzMTguc3VtJHByb19uYW1lKQogICAgZGYkZGVwdGggPC0gcm93bmFtZXMoZGYpCiAgICByZXR1cm4oZGYgJT4lCiAgICAgICAgICAgICBwaXZvdF9sb25nZXIoIWRlcHRoLCBuYW1lc190byA9ICJwcm9fbmFtZSIsIHZhbHVlc190byA9IG5hbWVzKHJhczE4LnNwKVtpXSkpCiAgfSksCiAgbGVmdF9qb2luLAogIGJ5ID0gYygiZGVwdGgiLCAicHJvX25hbWUiKQopKQpyYXMxOC5zcC5kZiA8LSByYXMxOC5zcC5kZlstd2hpY2gocmFzMTguc3AuZGYkZGVwdGggPT0gInNvaWwgZGVwdGgiKSwgXQpyYXMxOC5zcC5kZiRseXJfYm90IDwtIHJlcChzZXEoMTAsIDEwMCwgMTApLCBlYWNoID0gOSkKcmFzMTguc3AuZGYgPC0gcmFzMTguc3AuZGZbY29tcGxldGUuY2FzZXMocmFzMTguc3AuZGYpLCBdCnJhczE4LnNwLmRmJFBNIDwtIHN1YnN0cihyYXMxOC5zcC5kZiRwcm9fbmFtZSwgMSwgMikKcmFzMTguc3AuZGYkRUNPIDwtIHN1YnN0cihyYXMxOC5zcC5kZiRwcm9fbmFtZSwgMywgNCkKc2F2ZShyYXMxOC5zcC5kZiwgZmlsZSA9ICJyYXMxOC5zcC5kZi5SRGF0YSIpCgojIHJlc2hhcGUgc3JhLnRzLmFsbCB3LyBidWxrIGFuZCBpbmMgaW4gc2VwYXJhdGUgY29scwpubXMuaW5jLmJsazIgPC0gbm1zLmluYy5ibGsKbm1zLmluYy5ibGsyW1s0XV0gPC0gInllYXIiCnNyYS50cy5hbGwuYmxrLmluYyA8LSBtZXJnZShzcmEudHMuYWxsW3NyYS50cy5hbGwkVHlwZSA9PSAiYnVsayIsIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmEudHMuYWxsW3NyYS50cy5hbGwkVHlwZSA9PSAiaW5jIiwgYyhubXMuaW5jLmJsazIsICJkMTRjIiwgImQxNGNfdSIsICJkMTRjX2wiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IG5tcy5pbmMuYmxrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzID0gYygiX2J1bGsiLCAiX2luYyIpKSAlPiUKICBmaWx0ZXIoeWVhciAhPSAyMDA5KSAlPiUKICBtdXRhdGUoYmxrLmluYyA9IGQxNGNfYnVsayAtIGQxNGNfaW5jLAogICAgICAgICBibGsuaW5jLnNkID0gc3FydCgoZDE0Y191X2J1bGsgLSBkMTRjX2J1bGspXjIgKyBhcHBseShjYmluZChkMTRjX3VfaW5jLCBkMTRjX2xfaW5jKSwgMSwgdmFyKSkpCgojIGpvaW4gdy8gZDE0YwpzcmEuYWxsLm1pbiA8LSByYXMxOC5zcC5kZiAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvID0gaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSkgJT4lCiAgIyBtdXRhdGUoQWxfbm9uQ3J5cyA9IEFsX294IC0gQWxfcHksCiAgIyAgICAgICAgRmVfQ3J5cyA9IEZlX2RjIC0gRmVfb3gpICU+JQogIHNlbGVjdCgtUE0sIC1FQ08sIC1wcm9fbmFtZSkgJT4lCiAgbGVmdF9qb2luKHNyYS50cy5hbGwuYmxrLmluY1sgLCBjKCJwbSIsICJlY28iLCAibHlyX2JvdCIsICJ5ZWFyIiwgImQxNGNfYnVsayIsICJkMTRjX3VfYnVsayIsICJkMTRjX2luYyIsICJkMTRjX3VfaW5jIiwgImQxNGNfbF9pbmMiLCAiZDE0Y19sX2J1bGsiLCAiYmxrLmluYyIsICJibGsuaW5jLnNkIildLCAKICAgICAgICAgICAgLiwgCiAgICAgICAgICAgIGJ5ID0gYygicG0iLCAiZWNvIiwgImx5cl9ib3QiKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJBbF9weSIsICJBbF9veCIsICJGZV9veCIsICJGZV9kYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAjICJBbF9ub25DcnlzIiwgIkZlX0NyeXMiCiAgICAgICAgICAgICAgICAgICAgICAgICksIG5hbWVzX3RvID0gIm1pbiIsIHZhbHVlc190byA9ICJjb25jIikKCiMgQ3JlYXRlIG1pbi8xNGMgZGYgdy8gMC0zMGNtIDE0QyBkYXRhCnNyYS5hbGwuMzAubWluIDwtIG1lcmdlKHNyYS4zMC5ibGsuaW5jLmRmLCByYXMxOF8zLnNwLmRmLCBieSA9ICJQTWVjbyIpICU+JQogIG11dGF0ZShwbSA9IGlmZWxzZShzdWJzdHIoUE1lY28sIDEsIDIpID09ICJBTiIsICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3Vic3RyKFBNZWNvLCAxLCAyKSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIGVjbyA9IGlmZWxzZShzdWJzdHIoUE1lY28sIDMsIDQpID09ICJwcCIsICJ3YXJtIiwgCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3Vic3RyKFBNZWNvLCAzLCA0KSA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpKQoKCiMgc2F2ZQpzYXZlKHNyYS5hbGwubWluLCBmaWxlID0gInNyYS5hbGwubWluLlJEYXRhIikKc2F2ZShzcmEuYWxsLjMwLm1pbiwgZmlsZSA9ICJzcmEuYWxsLjMwLm1pbi5SRGF0YSIpCmBgYAoKYGBge3IgcGxvdC1taW4tMTRjfQojIGJ1bGsKc3JhLmFsbC5taW4gJT4lCiAgbXV0YXRlKHBtRWNvRGVwdGggPSBwYXN0ZTAocG0sIGVjbywgbHlyX2JvdCksCiAgICAgICAgIGVjb1llYXIgPSBwYXN0ZTAoZWNvLCAiICgiLCB5ZWFyLCAiKSIpLAogICAgICAgICB3aWR0aCA9IGlmZWxzZShtaW4gPT0gIkFsX3B5IiB8IG1pbiA9PSAiRmVfb3giLCAuMywgMS41KSkgJT4lCiAgZmlsdGVyKHBtRWNvRGVwdGggIT0gImdyYW5pdGVjb2xkMzAiICYgcG1FY29EZXB0aCAhPSAiZ3Jhbml0ZWNvbGQyMCIpICU+JQogIGdncGxvdCguLCBhZXMoY29uYywgZDE0Y19idWxrKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciwgc2l6ZSA9IGRlcHRoKSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfbF9idWxrLAogICAgICAgIHltYXggPSBkMTRjX3VfYnVsaywKICAgICAgICBjb2xvciA9IHBtLAogICAgICAgIHdpZHRoID0gd2lkdGgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKG5hbWUgPSAiRGVwdGgiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9ICgzOjUpKSArCiAgZmFjZXRfd3JhcCh2YXJzKG1pbiksIHNjYWxlcyA9ICJmcmVlIikgKwogIHlsYWIoZXhwcmVzc2lvbignQnVsayAtIFJlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQ29uY2VudHJhdGlvbiAoZyBrZydeLTEqJyknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGluYwpzcmEuYWxsLm1pbiAlPiUKICBtdXRhdGUocG1FY29EZXB0aCA9IHBhc3RlMChwbSwgZWNvLCBseXJfYm90KSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChlY28sICIgKCIsIHllYXIsICIpIiksCiAgICAgICAgIHdpZHRoID0gaWZlbHNlKG1pbiA9PSAiQWxfcHkiIHwgbWluID09ICJGZV9veCIsIC4zLCAxLjUpKSAlPiUKICBmaWx0ZXIocG1FY29EZXB0aCAhPSAiZ3Jhbml0ZWNvbGQzMCIgJiBwbUVjb0RlcHRoICE9ICJncmFuaXRlY29sZDIwIikgJT4lCiAgZmlsdGVyKGx5cl9ib3QgPT0gMzApICU+JQogIGdncGxvdCguLCBhZXMoY29uYywgZDE0Y19pbmMpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY29ZZWFyLCBzaXplID0gZGVwdGgpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19sX2luYywKICAgICAgICB5bWF4ID0gZDE0Y191X2luYywKICAgICAgICBjb2xvciA9IHBtLAogICAgICAgIHdpZHRoID0gd2lkdGgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlICh5ZWFyKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMTkpIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDE5KSIgPSAyKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKG5hbWUgPSAiRGVwdGgiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9ICgzOjUpKSArCiAgZmFjZXRfd3JhcCh2YXJzKG1pbiksIHNjYWxlcyA9ICJmcmVlIikgKwogIHlsYWIoZXhwcmVzc2lvbignQnVsayAtIFJlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQ29uY2VudHJhdGlvbiAoZyBrZydeLTEqJyknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGJ1bGstaW5jCnNyYS5hbGwubWluICU+JQogIG11dGF0ZShwbUVjb0RlcHRoID0gcGFzdGUwKHBtLCBlY28sIGx5cl9ib3QpLAogICAgICAgICBlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgeWVhciwgIikiKSwKICAgICAgICAgd2lkdGggPSBpZmVsc2UobWluID09ICJBbF9weSIgfCBtaW4gPT0gIkZlX294IiwgLjMsIDEuNSkpICU+JQogIGZpbHRlcihwbUVjb0RlcHRoICE9ICJncmFuaXRlY29sZDMwIiAmIHBtRWNvRGVwdGggIT0gImdyYW5pdGVjb2xkMjAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGNvbmMsIGJsay5pbmMpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY29ZZWFyLCBzaXplID0gZGVwdGgpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gYmxrLmluYyAtIGJsay5pbmMuc2QsCiAgICAgICAgeW1heCA9IGJsay5pbmMgKyBibGsuaW5jLnNkLAogICAgICAgIGNvbG9yID0gcG0sCiAgICAgICAgd2lkdGggPSB3aWR0aCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUgKHllYXIpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoMjAwMSkiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMDEpIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtICgyMDE5KSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMTkpIiA9IDIpKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwobmFtZSA9ICJEZXB0aCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gKDM6NSkpICsKICBmYWNldF93cmFwKHZhcnMobWluKSwgc2NhbGVzID0gImZyZWUiKSArCiAgeWxhYihleHByZXNzaW9uKCdCdWxrIC0gUmVzcGlyZWQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeGxhYihleHByZXNzaW9uKCdDb25jZW50cmF0aW9uIChnIGtnJ14tMSonKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgRmVfZGMgYWxvbmUKIyMjIyMKIyB3YXJtCnNyYS5hbGwubWluICU+JQogIGZpbHRlcihlY28gPT0gIndhcm0iICYgbWluID09ICJGZV9kYyIpICU+JQogIG11dGF0ZShlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgeWVhciwgIikiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhjb25jLCBibGsuaW5jKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciwgc2l6ZSA9IGRlcHRoKSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGJsay5pbmMgLSBibGsuaW5jLnNkLAogICAgICAgIHltYXggPSBibGsuaW5jICsgYmxrLmluYy5zZCwKICAgICAgICBjb2xvciA9IHBtKSwKICAgICAgICB3aWR0aCA9IDEuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDAxKSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCkpICsKICBzY2FsZV9zaXplX21hbnVhbChuYW1lID0gIkRlcHRoIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSAoMzo1KSkgKwogIGZhY2V0X3dyYXAodmFycyhtaW4pLCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKGV4cHJlc3Npb24oJ0J1bGsgLSBSZXNwaXJlZCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKGV4cHJlc3Npb24oJ0NvbmNlbnRyYXRpb24gKGcga2cnXi0xKicpJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBjb29sICsgY29sZApzcmEuYWxsLm1pbiAlPiUKICBmaWx0ZXIoZWNvICE9ICJ3YXJtIiAmIG1pbiA9PSAiRmVfZGMiKSAlPiUKICBtdXRhdGUocG1FY29EZXB0aCA9IHBhc3RlMChwbSwgZWNvLCBseXJfYm90KSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChlY28sICIgKCIsIHllYXIsICIpIikpICU+JQogIGZpbHRlcihwbUVjb0RlcHRoICE9ICJncmFuaXRlY29sZDMwIiAmIHBtRWNvRGVwdGggIT0gImdyYW5pdGVjb2xkMjAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGNvbmMsIGJsay5pbmMpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY29ZZWFyLCBzaXplID0gZGVwdGgpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gYmxrLmluYyAtIGJsay5pbmMuc2QsCiAgICAgICAgeW1heCA9IGJsay5pbmMgKyBibGsuaW5jLnNkLAogICAgICAgIGNvbG9yID0gcG0pLAogICAgICAgIHdpZHRoID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUgKHllYXIpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29vbCAoMjAwMSkiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkICgyMDAxKSIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMTkpIiA9IDIpKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwobmFtZSA9ICJEZXB0aCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gKDM6NSkpICsKICBmYWNldF93cmFwKHZhcnMobWluKSwgc2NhbGVzID0gImZyZWUiKSArCiAgeWxhYihleHByZXNzaW9uKCdCdWxrIC0gUmVzcGlyZWQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeGxhYihleHByZXNzaW9uKCdDb25jZW50cmF0aW9uIChnIGtnJ14tMSonKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyMjIyMKCiMjIGJ5IGRlcHRoCiMjIyMjCiMgIyAxMCBjbQojIHNyYS5hbGwubWluICU+JQojICAgbXV0YXRlKGVjb1llYXIgPSBwYXN0ZTAoZWNvLCAiICgiLCB5ZWFyLCAiKSIpLAojICAgICAgICAgIHdpZHRoID0gaWZlbHNlKG1pbiA9PSAiQWxfcHkiIHwgbWluID09ICJGZV9veCIsIC4zLCAxLjUpKSAlPiUKIyAgIGZpbHRlcihseXJfYm90ID09IDEwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoY29uYywgYmxrLmluYykpICsKIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciksIHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGJsay5pbmMgLSBibGsuaW5jLnNkLAojICAgICAgICAgeW1heCA9IGJsay5pbmMgKyBibGsuaW5jLnNkLAojICAgICAgICAgY29sb3IgPSBwbSwKIyAgICAgICAgIHdpZHRoID0gd2lkdGgpKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSAoeWVhcikiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKIyAgIGZhY2V0X3dyYXAodmFycyhtaW4pLCBzY2FsZXMgPSAiZnJlZSIpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignQnVsayAtIFJlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb25jZW50cmF0aW9uIChnIGtnJ14tMSonKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyAyMCBjbQojIHNyYS5hbGwubWluICU+JQojICAgbXV0YXRlKHBtRWNvRGVwdGggPSBwYXN0ZTAocG0sIGVjbywgbHlyX2JvdCksCiMgICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChlY28sICIgKCIsIHllYXIsICIpIiksCiMgICAgICAgICAgd2lkdGggPSBpZmVsc2UobWluID09ICJBbF9weSIgfCBtaW4gPT0gIkZlX294IiwgLjMsIDEuNSkpICU+JQojICAgZmlsdGVyKHBtRWNvRGVwdGggIT0gImdyYW5pdGVjb2xkMjAiKSAlPiUKIyAgIGZpbHRlcihseXJfYm90ID09IDIwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoY29uYywgYmxrLmluYykpICsKIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciksIHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGJsay5pbmMgLSBibGsuaW5jLnNkLAojICAgICAgICAgeW1heCA9IGJsay5pbmMgKyBibGsuaW5jLnNkLAojICAgICAgICAgY29sb3IgPSBwbSwKIyAgICAgICAgIHdpZHRoID0gd2lkdGgpKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSAoeWVhcikiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKIyAgIGZhY2V0X3dyYXAodmFycyhtaW4pLCBzY2FsZXMgPSAiZnJlZSIpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignQnVsayAtIFJlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb25jZW50cmF0aW9uIChnIGtnJ14tMSonKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyAzMCBjbQojIHNyYS5hbGwubWluICU+JQojICAgbXV0YXRlKHBtRWNvRGVwdGggPSBwYXN0ZTAocG0sIGVjbywgbHlyX2JvdCksCiMgICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChlY28sICIgKCIsIHllYXIsICIpIiksCiMgICAgICAgICAgd2lkdGggPSBpZmVsc2UobWluID09ICJBbF9weSIgfCBtaW4gPT0gIkZlX294IiwgLjMsIDEuNSkpICU+JQojICAgZmlsdGVyKHBtRWNvRGVwdGggIT0gImdyYW5pdGVjb2xkMzAiKSAlPiUKIyAgIGZpbHRlcihseXJfYm90ID09IDMwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoY29uYywgYmxrLmluYykpICsKIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhciksIHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGJsay5pbmMgLSBibGsuaW5jLnNkLAojICAgICAgICAgeW1heCA9IGJsay5pbmMgKyBibGsuaW5jLnNkLAojICAgICAgICAgY29sb3IgPSBwbSwKIyAgICAgICAgIHdpZHRoID0gd2lkdGgpKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSAoeWVhcikiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0gKDIwMDEpIiA9IDE1LCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoMjAxOSkiID0gMCwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKIyAgIGZhY2V0X3dyYXAodmFycyhtaW4pLCBzY2FsZXMgPSAiZnJlZSIpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignQnVsayAtIFJlc3BpcmVkICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb25jZW50cmF0aW9uIChnIGtnJ14tMSonKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgdHMtc3RhdHN9CiMgZnVuY3Rpb24gZm9yIFR1a2V5IEhTRCB0YWJsZXMKdHVrZXkudGFibGUuZnggPC0gZnVuY3Rpb24oeCwgeWVhciwgdHlwZSwgdmFyKSB7CiAgZGVwdGggPC0gcGFzdGUwKHVuaXF1ZSh4JGx5cl9ib3QpIC0gMTAsICItIiwgdW5pcXVlKHgkbHlyX2JvdCksICIgY20iKQogIGlmICh0eXBlID09ICJpbmMiKSB7CiAgICB4IDwtIHhbeCRkMTRjID4gLTIwMCwgYygiZDE0YyIsIHZhcildCiAgfSAKICByZXR1cm4oCiAgICBUdWtleUhTRChhb3YocmVmb3JtdWxhdGUodmFyLCAiZDE0YyIpLCB4KSlbdmFyXSAlPiUKICAgIGRhdGEuZnJhbWUoLikgJT4lCiAgICBtdXRhdGUoUGFpcnMgPSByb3duYW1lcyguKSkgJT4lCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCByb3VuZCwgMykpICU+JQogICAgZ3QoKSAlPiUKICAgIHRhYl9oZWFkZXIoCiAgICAgIHRpdGxlID0gZGVwdGgsCiAgICAgIHN1YnRpdGxlID0gcGFzdGUoeWVhciwgdHlwZSwgdmFyKQogICAgKSkKfQoKIyMjIDIwMDEKIyMgYnVsawpzcmEuMjAwMS5idWxrLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3JhLjE5LjAxLnJlcC5scywgZnVuY3Rpb24obHMpIHsKICAgIGxzIDwtIGxhcHBseShscywgZnVuY3Rpb24oeCkgeFtjb21wbGV0ZS5jYXNlcyh4KV0pCiAgICBkMTRjIDwtIGNhbGNfMTRjKHVubGlzdChscyksIDIwMDEpCiAgICBkZiA8LSBkYXRhLmZyYW1lKGQxNGMgPSBkMTRjLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gcmVwKGMoMTAsIDIwLCAzMCksIGxlbmd0aChkMTRjKSAvIDMpKQogICAgcmV0dXJuKGRmKQogIH0pLAogIC5pZCA9ICJQTWVjbyIpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjbywgMywgNCkpCiMgUE0KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMDEuYnVsay5kZiwgc3JhLjIwMDEuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgc3VtbWFyeShsbShkMTRjIH4gUE0sIHgpKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5idWxrLmRmLCBzcmEuMjAwMS5idWxrLmRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiYnVsayIsICJQTSIpCn0pCiMgRUNPCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmJ1bGsuZGYsIHNyYS4yMDAxLmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeCkpCiMgfSkKbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmJ1bGsuZGYsIHNyYS4yMDAxLmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICB0dWtleS50YWJsZS5meCh4LCAiMjAwMSIsICJidWxrIiwgIkVDTyIpCn0pCgojIyBpbmMKc3JhLjIwMDEuaW5jLmRmMiA8LSBjYmluZChzcmEuMTkuMDEuaW5jLmRmW3JlcCgxOm5yb3coc3JhLjE5LjAxLmluYy5kZiksIDIpLCBjKCJQTSIsICJFQ08iLCAibHlyX2JvdCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkMTRjID0gYyhzcmEuMTkuMDEuaW5jLmRmJGQxNGNfbWluLCBzcmEuMTkuMDEuaW5jLmRmJGQxNGNfbWF4KSkKc2F2ZShzcmEuMjAwMS5pbmMuZGYyLCBmaWxlID0gInNyYS4yMDAxLmluYy5kZjIuUkRhdGEiKQojIFBNCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDAxLmluYy5kZjIsIHNyYS4yMDAxLmluYy5kZjIkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IFBNLCB4W3gkZDE0YyA+IC0yMDAsIF0pKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYyLCBzcmEuMjAwMS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiaW5jIiwgIlBNIikKfSkKIyBFQ08KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMDEuaW5jLmRmMiwgc3JhLjIwMDEuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgc3VtbWFyeShsbShkMTRjIH4gRUNPLCB4W3gkZDE0YyA+IC0yMDAsIF0pKQojIH0pCmxhcHBseShzcGxpdChzcmEuMjAwMS5pbmMuZGYyLCBzcmEuMjAwMS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgdHVrZXkudGFibGUuZngoeCwgIjIwMDEiLCAiaW5jIiwgIkVDTyIpCn0pCgojIyMgMjAxOQojIyBidWxrCnNyYS4yMDE5LmJ1bGsuZGYgPC0gYmluZF9yb3dzKHNyYS4yMDE5LmxzKQojIFBNCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmJ1bGsuZGYsIHNyYS4yMDE5LmJ1bGsuZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIGlmIChucm93KHgpID09IDI3KSBzdW1tYXJ5KGxtKGQxNGMgfiBQTSwgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIGlmIChucm93KHgpID09IDI3KSB0dWtleS50YWJsZS5meCh4LCAiMjAxOSIsICJidWxrIiwgIlBNIikKfSkKIyBFQ08KIyBsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewojICAgaWYgKG5yb3coeCkgPT0gMjcpIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuYnVsay5kZiwgc3JhLjIwMTkuYnVsay5kZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIGlmIChucm93KHgpID09IDI3KSB0dWtleS50YWJsZS5meCh4LCAiMjAxOSIsICJidWxrIiwgIkVDTyIpCn0pCiMjIGluYwpzcmEuMjAxOS5pbmMuZGYyIDwtIGJpbmRfcm93cyhzcmEuMjAxOS5pbmMubHMpCnNhdmUoc3JhLjIwMTkuaW5jLmRmMiwgZmlsZSA9ICJzcmEuMjAxOS5pbmMuZGYyLlJEYXRhIikKIyBQTQojIGxhcHBseShzcGxpdChzcmEuMjAxOS5pbmMuZGYyLCBzcmEuMjAxOS5pbmMuZGYyJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiMgICBzdW1tYXJ5KGxtKGQxNGMgfiBQTSwgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmMiwgc3JhLjIwMTkuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIHR1a2V5LnRhYmxlLmZ4KHgsICIyMDE5IiwgImluYyIsICJQTSIpCn0pCiMgRUNPCiMgbGFwcGx5KHNwbGl0KHNyYS4yMDE5LmluYy5kZjIsIHNyYS4yMDE5LmluYy5kZjIkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKIyAgIHN1bW1hcnkobG0oZDE0YyB+IEVDTywgeFt4JGQxNGMgPiAtMjAwLCBdKSkKIyB9KQpsYXBwbHkoc3BsaXQoc3JhLjIwMTkuaW5jLmRmMiwgc3JhLjIwMTkuaW5jLmRmMiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogIHR1a2V5LnRhYmxlLmZ4KHgsICIyMDE5IiwgImluYyIsICJFQ08iKQp9KQoKIyBjb21wYXJlIDIwMDEgYW5kIDIwMTkKIyBidWxrCnNyYS4wMS4xOS5idWxrLmRmIDwtIGRhdGEuZnJhbWUoCiAgcmJpbmQoc3JhLjIwMDEuYnVsay5kZiwgCiAgICAgICAgc3JhLjIwMTkuYnVsay5kZlssIHdoaWNoKG5hbWVzKHNyYS4yMDE5LmJ1bGsuZGYpICVpbiUgbmFtZXMoc3JhLjIwMDEuYnVsay5kZikpXSksCiAgeWVhciA9IGFzLmZhY3RvcihjKHJlcCgyMDAxLCBucm93KHNyYS4yMDAxLmJ1bGsuZGYpKSwgcmVwKDIwMTksIG5yb3coc3JhLjIwMTkuYnVsay5kZikpKSkpICU+JQogIGZpbHRlcihseXJfYm90IDwgMzEpCnNyYS4wMS4xOS5idWxrLmxzIDwtIHNwbGl0KHNyYS4wMS4xOS5idWxrLmRmLCBzcmEuMDEuMTkuYnVsay5kZiRQTWVjbykKbGFwcGx5KHNyYS4wMS4xOS5idWxrLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHR1a2V5LnRhYmxlLmZ4KHgsIHBhc3RlMCh1bmlxdWUoZGYkUE1lY28pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImJ1bGsiLCAieWVhciIpCiAgfSkKfSkKIyBieSBQTQpsYXBwbHkoc3BsaXQoc3JhLjAxLjE5LmJ1bGsuZGYsIHNyYS4wMS4xOS5idWxrLmRmJFBNKSwgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgICB0dWtleS50YWJsZS5meCh4LCBwYXN0ZTAodW5pcXVlKGRmJFBNKSwgIiAyMDAxIHZzLiAyMDE5IiksICJidWxrIiwgInllYXIiKQogIH0pCn0pCiMgYnkgRUNPCmxhcHBseShzcGxpdChzcmEuMDEuMTkuYnVsay5kZiwgc3JhLjAxLjE5LmJ1bGsuZGYkRUNPKSwgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJGx5cl9ib3QpLCBmdW5jdGlvbih4KSB7CiAgICB0dWtleS50YWJsZS5meCh4LCBwYXN0ZTAodW5pcXVlKGRmJEVDTyksICIgMjAwMSB2cy4gMjAxOSIpLCAiYnVsayIsICJ5ZWFyIikKICB9KQp9KQojIGluYwpzcmEuMDEuMTkuaW5jLmRmIDwtIGRhdGEuZnJhbWUoCiAgZDE0YyA9IGMoc3JhLjE5LjAxLmluY1sgLCAiZDE0Y19taW4iXSwKICAgICAgICAgICBzcmEuMTkuMDEuaW5jWyAsICJkMTRjX21heCJdKSwKICBzcmEuMTkuMDEuaW5jWyAsIGMoIlBNZWNvIiwgImx5cl9ib3QiLCAiUE0iLCAiRUNPIiwgInllYXIiKV0pICU+JQogIG11dGF0ZSh5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQpzcmEuMDEuMTkuaW5jLmxzIDwtIHNwbGl0KHNyYS4wMS4xOS5pbmMuZGYsIHNyYS4wMS4xOS5pbmMuZGYkUE1lY28pCmxhcHBseShzcmEuMDEuMTkuaW5jLmxzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIHR1a2V5LnRhYmxlLmZ4KHgsIHBhc3RlMCh1bmlxdWUoZGYkUE1lY28pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImluYyIsICJ5ZWFyIikKICB9KQp9KQpsYXBwbHkoc3BsaXQoc3JhLjAxLjE5LmluYy5kZiwgc3JhLjAxLjE5LmluYy5kZiRQTSksIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgdHVrZXkudGFibGUuZngoeCwgcGFzdGUwKHVuaXF1ZShkZiRQTSksICIgMjAwMSB2cy4gMjAxOSIpLCAiaW5jIiwgInllYXIiKQogIH0pCn0pCmxhcHBseShzcGxpdChzcmEuMDEuMTkuaW5jLmRmLCBzcmEuMDEuMTkuaW5jLmRmJEVDTyksIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgdHVrZXkudGFibGUuZngoeCwgcGFzdGUwKHVuaXF1ZShkZiRFQ08pLCAiIDIwMDEgdnMuIDIwMTkiKSwgImluYyIsICJ5ZWFyIikKICB9KQp9KQpgYGAKCmBgYHtyIG1pbi0xNGMtc3RhdHN9CnNyYS4wMS4xOS5taW4ucmVwcyA8LSBsZWZ0X2pvaW4oCiAgbWVyZ2Uoc3JhLjAxLjE5LmJ1bGsuZGYsIHNyYS4wMS4xOS5pbmMuZGYsCiAgICAgICAgYnkgPSBjKCJQTWVjbyIsICJQTSIsICJFQ08iLCAieWVhciIsICJseXJfYm90IiksCiAgICAgICAgc3VmZml4ZXMgPSBjKCJfYmxrIiwgIl9pbmMiKSksCiAgcmFzMTguc3AuZGZbICwgYygiQWxfb3giLCAiQWxfcHkiLCAiRmVfZGMiLCAiRmVfb3giLCAiUE0iLCAiRUNPIiwgImx5cl9ib3QiKV0sCiAgYnkgPSBjKCJQTSIsICJFQ08iLCAibHlyX2JvdCIpKSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHllYXIpKSkKCnN1bW1hcnkobG0oZDE0Y19ibGsgfiBBbF9veCArIGx5cl9ib3QgKyB5ZWFyLCBzcmEuMDEuMTkubWluLnJlcHMpKQpzcmEuMDEuMTkubWluLnJlcHMgJT4lCiAgbXV0YXRlKGVjbyA9IGlmZWxzZShFQ08gPT0gInJmIiwgImNvbGQiLCBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgIndhcm0iKSkpICU+JQogIG11dGF0ZShlY29ZZWFyID0gcGFzdGUwKGVjbywgIiAoIiwgeWVhciwgIikiKSkgJT4lCiAgIyBmaWx0ZXIocG1FY29EZXB0aCAhPSAiZ3Jhbml0ZWNvbGQzMCIgJiBwbUVjb0RlcHRoICE9ICJncmFuaXRlY29sZDIwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhBbF9veCwgZDE0Y19ibGspKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBQTSwgc2hhcGUgPSBlY29ZZWFyKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUgKHllYXIpIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoMjAwMSkiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDAxKSIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMDEpIiA9IDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJtICgyMDE5KSIgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoMjAxOSkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQgKDIwMTkpIiA9IDIpKSArCiAgZmFjZXRfd3JhcCh2YXJzKGx5cl9ib3QpKSArCiAgeWxhYihleHByZXNzaW9uKCdCdWxrICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoZXhwcmVzc2lvbignT3hhbGF0ZSBleHRyYWN0YWJsZSBBbCAoZyBrZydeLTEqJyknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgdHVrZXktcGxvdHN9CiMgY29sb3IgcGFsZXR0ZXMgZm9yIEVDTyAmIFBNCndhcm0gPC0gIiNCRjgxMkQiCmNvb2wgPC0gIiM4MENEQzEiCmNvbGQgPC0gIiMwMTY2NUUiCmdyYW5pdGUgPC0gIiM5ZGFiYTkiCmFuZGVzaXRlIDwtICIjMzgyZGJmIgpiYXNhbHQgPC0gIiNiZjM4MmQiCgojIHBsb3QgZngKYm94cGxvdC5meCA8LSBmdW5jdGlvbihkZiwgdmFyLCB5ZWFyLCB0eXBlLCB0b3Bzb2lsID0gRkFMU0UsIHN1YnNvaWwgPSBGQUxTRSkgewogIGF0bSA8LSBpZmVsc2UoeWVhciA9PSAiMjAwMSIsIGF0bS5kMTQuMjAwMSwgYXRtLmQxNC4yMDE5KQogIGlmICh0eXBlID09ICJpbmMiKSB7CiAgICBkZiA8LSBkZltkZiRkMTRjID4gLTIwMCwgXQogICAgeWxpbSA8LSBjKC02NSwgMTY1KQogIH0gZWxzZSB7CiAgICBpZiAodG9wc29pbCkgewogICAgICBkZiA8LSBkZltkZiRseXJfYm90IDwgMzEsIF0KICAgICAgeWxpbSA8LSBjKC0xMjAsIDE2NSkKICAgICAgfQogICAgaWYgKHN1YnNvaWwpIHsKICAgICAgZGYgPC0gZGZbZGYkbHlyX2JvdCA+IDMxLCBdCiAgICAgIHlsaW0gPC0gYygtMjcwLCA2NSkKICAgIH0KICB9CiAgaWYgKHZhciA9PSAiUE0iKSB7CiAgICBkZiAlPiUKICAgICAgbXV0YXRlKHBtID0gZmFjdG9yKGlmZWxzZShQTSA9PSAiR1IiLCAiZ3Jhbml0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsICJiYXNhbHQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJncmFuaXRlIiwgImFuZGVzaXRlIiwgImJhc2FsdCIpKSkgJT4lCiAgICAgIGdyb3VwX2J5KHBtLCBseXJfYm90KSAlPiUKICAgICAgZ2dwbG90KC4sIGFlcyhwbSwgZDE0YykpICsKICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBhbHBoYSA9IDAuMykgKwogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgICAgIGdlb21fYm94cGxvdChhZXMoY29sb3IgPSBwbSksIGx3ZCA9IDEpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICJub25lIikgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0geWxpbSkgKwogICAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGx5cl9ib3QpKSArCiAgICAgIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICAgIGdndGl0bGUocGFzdGUoeWVhciwgdHlwZSkpICsKICAgICAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKICB9IGVsc2UgewogICAgZGYgJT4lCiAgICAgIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSkgJT4lCiAgICAgIGdyb3VwX2J5KGVjbywgbHlyX2JvdCkgJT4lCiAgICAgIGdncGxvdCguLCBhZXMoZWNvLCBkMTRjKSkgKwogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdG0sIGxpbmV0eXBlID0gImRvdHRlZCIsIGFscGhhID0gMC4zKSArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgICAgZ2VvbV9ib3hwbG90KGFlcyhjb2xvciA9IGVjbyksIGx3ZCA9IDEpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gY29vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gY29sZCksCiAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICJub25lIikgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0geWxpbSkgKwogICAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGx5cl9ib3QpKSArCiAgICAgIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICAgIGdndGl0bGUocGFzdGUoeWVhciwgdHlwZSkpICsKICAgICAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKICB9Cn0KCiMgYnVsawpib3hwbG90LmZ4KHNyYS4yMDAxLmJ1bGsuZGYsICJQTSIsICIyMDAxIiwgImJ1bGsiLCB0b3Bzb2lsID0gVFJVRSkKYm94cGxvdC5meChzcmEuMjAxOS5idWxrLmRmLCAiUE0iLCAiMjAxOSIsICJidWxrIiwgdG9wc29pbCA9IFRSVUUpCmJveHBsb3QuZngoc3JhLjIwMDEuYnVsay5kZiwgIkVDTyIsICIyMDAxIiwgImJ1bGsiLCB0b3Bzb2lsID0gVFJVRSkKYm94cGxvdC5meChzcmEuMjAxOS5idWxrLmRmLCAiRUNPIiwgIjIwMTkiLCAiYnVsayIsIHRvcHNvaWwgPSBUUlVFKQpib3hwbG90LmZ4KHNyYS4yMDE5LmJ1bGsuZGYsICJFQ08iLCAiMjAxOSIsICJidWxrIiwgc3Vic29pbCA9IFRSVUUpCiMgaW5jCmJveHBsb3QuZngoc3JhLjIwMDEuaW5jLmRmMiwgIlBNIiwgIjIwMDEiLCAiaW5jIikKYm94cGxvdC5meChzcmEuMjAxOS5pbmMuZGYyLCAiUE0iLCAiMjAxOSIsICJpbmMiKQpib3hwbG90LmZ4KHNyYS4yMDAxLmluYy5kZjIsICJFQ08iLCAiMjAwMSIsICJpbmMiKQpib3hwbG90LmZ4KHNyYS4yMDE5LmluYy5kZjIsICJFQ08iLCAiMjAxOSIsICJpbmMiKQpgYGAKCmBgYHtyIGRlbHRhLWRlbHRhLXBsb3RzfQojIGRhdGEsIHVuc3VtbWFyaXplZApzcmEudHMuYWxsLnJhdyA8LSByYmluZCgKICBzcmEuMjAwMS5idWxrLmRmWyAsIG5hbWVzKHNyYS4yMDAxLmJ1bGsuZGYpICVpbiUgbmFtZXMoc3JhLjIwMDEuaW5jLmRmMildLAogIHNyYS4yMDE5LmJ1bGsuZGZbICwgbmFtZXMoc3JhLjIwMTkuYnVsay5kZikgJWluJSBuYW1lcyhzcmEuMjAwMS5pbmMuZGYyKV0sCiAgc3JhLjIwMDEuaW5jLmRmMiwKICBzcmEuMjAxOS5pbmMuZGYyWyAsIG5hbWVzKHNyYS4yMDE5LmluYy5kZjIpICVpbiUgbmFtZXMoc3JhLjIwMDEuaW5jLmRmMildKSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGZhY3RvcihpZmVsc2UoUE0gPT0gIkdSIiwgImdyYW5pdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAiYmFzYWx0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZ3Jhbml0ZSIsICJhbmRlc2l0ZSIsICJiYXNhbHQiKSksCiAgICAgICAgIFR5cGUgPSBjKHJlcCgiYnVsayIsIGxlbmd0aCA9IG5yb3coc3JhLjIwMDEuYnVsay5kZikpLAogICAgICAgICAgICAgICAgICByZXAoImJ1bGsiLCBsZW5ndGggPSBucm93KHNyYS4yMDE5LmJ1bGsuZGYpKSwKICAgICAgICAgICAgICAgICAgcmVwKCJpbmMiLCBsZW5ndGggPSBucm93KHNyYS4yMDAxLmluYy5kZjIpKSwKICAgICAgICAgICAgICAgICAgcmVwKCJpbmMiLCBsZW5ndGggPSBucm93KHNyYS4yMDE5LmluYy5kZjIpKSksCiAgICAgICAgIHllYXIgPSBjKHJlcCgyMDAxLCBsZW5ndGggPSBucm93KHNyYS4yMDAxLmJ1bGsuZGYpKSwKICAgICAgICAgICAgICAgICAgcmVwKDIwMTksIGxlbmd0aCA9IG5yb3coc3JhLjIwMTkuYnVsay5kZikpLAogICAgICAgICAgICAgICAgICByZXAoMjAwMSwgbGVuZ3RoID0gbnJvdyhzcmEuMjAwMS5pbmMuZGYyKSksCiAgICAgICAgICAgICAgICAgIHJlcCgyMDE5LCBsZW5ndGggPSBucm93KHNyYS4yMDE5LmluYy5kZjIpKSkpCgojIHBsb3QgZngKdHMuZ3JvdXBQbG90LmZ4IDwtIGZ1bmN0aW9uKGRmLCB4LCB5KSB7CiAgcXVvX3ggPC0gc3ltKHgpCiAgcXVvX3kgPC0gc3ltKHkpCiAgaWYgKHggPT0gInBtIikgewogICAgdmFyLm5hbWUgPC0gIlBhcmVudCBtYXRlcmlhbCIKICAgIHZhci52YWx1ZXMgPC0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkgCiAgfSBlbHNlIHsKICAgIHZhci5uYW1lIDwtICJDbGltYXRlIgogICAgdmFyLnZhbHVlcyA8LSAgYygid2FybSIgPSB3YXJtLAogICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSBjb29sLAogICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSBjb2xkKQogIH0KICBwbG90LmRmIDwtIGRmICU+JQogICAgZmlsdGVyKGQxNGMgPiAtMjAwKSAlPiUKICAgIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogICAgZ3JvdXBfYnkoISEgcXVvX3gsIGx5cl9ib3QsIFR5cGUsIHllYXIpICU+JQogICAgc3VtbWFyaXplKGFjcm9zcyhkMTRjLCBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkpCiAgaWYgKHkgPT0gImRkMTRjIikgewogICAgcGxvdC5kZiA8LSBwbG90LmRmICU+JQogICAgICBtdXRhdGUoYXRtID0gaWZlbHNlKHllYXIgPT0gMjAwMSwgYXRtLmQxNC4yMDAxLCBhdG0uZDE0LjIwMTkpLAogICAgICAgICAgICAgZGQxNGMgPSBkMTRjX21lYW4gLSBhdG0sCiAgICAgICAgICAgICB1ID0gZDE0Y19tZWFuICsgZDE0Y19zZCAtIGF0bSwKICAgICAgICAgICAgIGwgPSBkMTRjX21lYW4gLSBkMTRjX3NkIC0gYXRtKQogICAgYXRtLmRmIDwtIGF0bS4xNGMKICAgIGF0bS5kZiRkMTRjIDwtIDAKICAgIHlsYWIgPC0gZXhwcmVzc2lvbihEZWx0YSpEZWx0YSonJ14xNConQyAo4oCwKScpIAogICAgfSBlbHNlIHsKICAgICAgcGxvdC5kZiA8LSBwbG90LmRmICU+JQogICAgICAgIG11dGF0ZSh1ID0gZDE0Y19tZWFuICsgZDE0Y19zZCwKICAgICAgICAgICAgICAgbCA9IGQxNGNfbWVhbiAtIGQxNGNfc2QpCiAgICAgIGF0bS5kZiA8LSBhdG0uMTRjCiAgICAgIHlsYWIgPC0gZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpIAogICAgfQogICAgZ2dwbG90KHBsb3QuZGYsIGFlcyh5ZWFyLCAhISBxdW9feSkpICsKICAgIGdlb21fcGF0aChkYXRhID0gYXRtLmRmLCBhZXMoeWVhciwgZDE0YykpICsKICAgIGdlb21fcGF0aChhZXMoY29sb3IgPSAhISBxdW9feCwgbGluZXR5cGUgPSBUeXBlKSwgYWxwaGEgPSAuNSwgbHdkID0gMSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAhISBxdW9feCksIAogICAgICAgICAgICAgICBzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgICBnZW9tX2Vycm9yYmFyKAogICAgICBhZXMoeW1pbiA9IGwsCiAgICAgICAgICB5bWF4ID0gdSwKICAgICAgICAgIGNvbG9yID0gISEgcXVvX3gsCiAgICAgICAgICBhbHBoYSA9IFR5cGUpLAogICAgICB3aWR0aCA9IDEsCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSB2YXIubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YXIudmFsdWVzKSArCiAgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIsKxU0QiLAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFyLnZhbHVlcykgKwogICAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoImJ1bGsiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmMiID0gLjUpKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGx5cl9ib3QpKSArCiAgICB5bGFiKHlsYWIpICsKICAgIHhsYWIoIlllYXIiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCn0KIyBwbG90CnRzLmdyb3VwUGxvdC5meChzcmEudHMuYWxsLnJhdywgInBtIiwgImRkMTRjIikKdHMuZ3JvdXBQbG90LmZ4KHNyYS50cy5hbGwucmF3LCAiZWNvIiwgImRkMTRjIikKdHMuZ3JvdXBQbG90LmZ4KHNyYS50cy5hbGwucmF3LCAicG0iLCAiZDE0Y19tZWFuIikKdHMuZ3JvdXBQbG90LmZ4KHNyYS50cy5hbGwucmF3LCAiZWNvIiwgImQxNGNfbWVhbiIpCmBgYAojIyBJbml0aWFsIG1vZGVsaW5nCgpUaGUgZ29hbCBvZiB0aGlzIG1vZGVsaW5nIGV4ZXJjaXNlIGlzIHRvIHNlZSBob3cgcGFyZW50IG1hdGVyaWFsIGFuZCBjbGltYXRlL2Vjb3N5c3RlbSBhZmZlY3QgZXN0aW1hdGVzIG9mIHNvaWwgY2FyYm9uIGFnZXMgYW5kIHRyYW5zaXQgdGltZXMuIEJ1bGsgc29pbCBeMTReQyBvYnNlcnZhdGlvbnMgZnJvbSAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3aWxsIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSBjYXJib24gbW9kZWxzLCBhcyB3ZWxsIGFzIG9ic2VydmF0aW9ucyBvZiBeMTReQy1DT34yfiBmcm9tIGxhYm9yYXRvcnkgc29pbCBpbmN1YmF0aW9ucyBvZiBzb2lscyBjb2xsZWN0ZWQgaW4gMjAwMSBhbmQgMjAxOS4gUHJldmlvdXMgd29yayBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIGNhcmJvbiBzdG9ja3MgYXQgdGhlc2Ugc2l0ZXMgaXMgbGlrZWx5IGF0IGVxdWlsaWJyaXVtLCBzbyB3ZSB3aWxsIGFwcGx5IHRoZSBzdGVhZHktc3RhdGUgYXNzdW1wdGlvbiB0byB0aGUgbW9kZWxpbmcuCgojIyMgVHdvLXBvb2wgbW9kZWxzCgpPbmUgcG9vbCBtb2RlbHMgaGF2ZSBiZWVuIHNob3duIHJlcGVhdGVkbHkgdG8gYmUgaW5hZGVxdWF0ZSBmb3IgZGVzY3JpYmluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gSG93ZXZlciwgYXMgc2ltcGxlIG1vZGVscyBhcmUgZWFzaWVyIHRvIGNvbnN0cmFpbiwgd2Ugd2lsbCBzdGFydCB3aXRoIGEgdHdvLXBvb2wgcGFyYWxsZWwgYW5kIHR3by1zZXJpZXMgbW9kZWxzLCBhcyB0aGVzZSBhcmUgdGhlIHNpbXBsZXN0IG1vZGVsIHN5c3RlbSBiZXlvbmQgdGhlIHNpbmdsZSBwb29sIGFwcHJvYWNoLiAKClRoZSB0d28tcG9vbCBwYXJhbGxlbCBtb2RlbCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiogZGVjb21wb3NpdGlvbiBjb25zdGFudHMgZm9yIGVhY2ggcG9vbCAoKmsqfjF+LCAqayp+Mn4pCiogaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50ICgkXGdhbW1hJCkKKiBzdGVhZHktc3RhdGUgY2FyYm9uIHN0b2NrcyAoQykKKiBpbnB1dHMgKEkpCiogaW5pdGlhbCB2YWx1ZXMgb2YgXjE0XkMKMQpUaGUgdHdvLXBvb2wgc2VyaWVzIG1vZGVsIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKiBkZWNvbXBvc2l0aW9uIGNvbnN0YW50cyBmb3IgZWFjaCBwb29sICgqayp+MX4sICprKn4yfikKKiB0cmFuc2ZlciBjb2VmZmljaWVudCAoJFxhbHBoYSQpCiogc3RlYWR5LXN0YXRlIGNhcmJvbiBzdG9ja3MgKEMpCiogaW5wdXRzIChJKQoqIGluaXRpYWwgdmFsdWVzIG9mIF4xNF5DCgpEZWNvbXBvc2l0aW9uIHJhdGVzICgqayopIGFyZSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgXjE0XkMgaW4gYSBwcmUtYm9tYiBzeXN0ZW0gKGZyYWN0aW9uIG1vZGVybiwgKkYqKSBhdCBzdGVhZHktc3RhdGUgYnkgdGhlIGZvbGxvd2luZyBlcXVhdGlvbnMgKGNmLiBTY2h1dXIsIERydWZmbGUsIGFuZCBUcnVtYm9yZSwgMjAxNik6Cj4qKkVxLiAxKioKCiQkRiA9IFxmcmFje2t9e2sgKyBcbGFtYmRhfSQkCj4qKkVxLiAyKioKCiQkayA9IFxmcmFje1xsYW1iZGEgXGNkb3QgRn17MSAtIEZ9JCQKPndoZXJlICRcbGFtYmRhJCBpcyB0aGUgcmFkaW9hY3RpdmUgZGVjYXkgY29uc3RhbnQgKDEvODI2NykuCgpBcyB0aGUgZGVjb21wb3NpdGlvbiByYXRlcyB3aWxsIHZhcnksIHRoZSBpbml0aWFsIF4xNF5DIGNvbnRlbnQgY2FuIGJlIGRldGVybWluZWQgZHluYW1pY2FsbHkgd2l0aCBlcXVhdGlvbiAxLgoKQ2FyYm9uIHN0b2NrcyBhcmUga25vd24sIHdoaWxlIGlucHV0cyB3aWxsIGJlIGVzdGltYXRlZCBhbmQgYXJlIHJlbGF0ZWQgdG8gdGhlIHN0ZWFkeS1zdGF0ZSBjb25kaXRpb25zIGJ5IHRoZSBmb2xsb3dpbmcgZXF1YXRpb246IAo+KipFcS4gMyoqCgokJEkgPSAoa197MX0gXGNkb3QgQ197MX0pICsgKGtfezJ9IFxjZG90IENfezJ9KSQkCj53aGVyZSAqQ34xfiogYW5kICpDfjJ+KiBhcmUgdGhlIGNhcmJvbiBzdG9ja3Mgb2YgdGhlIHR3byBtb2RlbCBwb29scy4KCkJvdGggc3RvY2tzIGFuZCBpbnB1dHMgY2FuIGJlIHNjYWxlZCB0byB0aGUga25vd24gdmFsdWUgb2YgdGhlIHRvdGFsIGNhcmJvbiBwb29sIG9uY2UgdGhlIHN0ZWFkeS1zdGF0ZSBwYXJhbWV0ZXJzICgqa34xfiosICprfjJ+KiwgYW5kICRcZ2FtbWEkIG9yICRcYWxwaGEkKSBoYXZlIGJlZW4gZGV0ZXJtaW5lZC4gUG9vbCBzaXplcyBhcmUgYSBmdW5jdGlvbiBvZiB0aGUgaW5wdXRzIGFuZCBpbnB1dCBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgYXQgc3RlYWR5LXN0YXRlLgoKQSBNb250ZS1DYXJsbyBNYXJrb3YgY2hhaW4gYXBwcm9hY2ggd2lsbCBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgZXN0aW1hdGlvbiBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIGluaXRpYWwgb3B0aW1pemF0aW9uIGFsZ29yaXRobSB0byBkZXRlcm1pbmUgdGhlIGJlc3Qgc2V0IG9mIGluaXRpYWwgcGFyYW1ldGVycy4KCiMjIFdvcmtmbG93CgpJbml0aWFsIG1vZGVsIGZpdHRpbmcgd2FzIHBlcmZvcm1lZCBmb3IgYm90aCBtb2RlbCBzdHJ1Y3R1cmVzIHVzaW5nIGdlbmVyb3VzIHBhcmFtZXRlciByYW5nZXMgWzAsIDFdIGZvciBhbGwgdGhyZWUgcGFyYW1ldGVycyAoKmt+MX4qLCAqa34yfiosICRcZ2FtbWEkIG9yICRcYWxwaGEkKS4gVGhlIGluaXRpYWwgcGFyYW1ldGVyIHNldCB3YXMgZm91bmQgYnkgZml0dGluZyB0aGUgbW9kZWxzIGJ5IGV5ZSwgZm9sbG93ZWQgYnkgb3B0aW1pemF0aW9uIHdpdGggdGhlIGZ1bmN0aW9uICJtb2RGaXQiIChSIHBhY2thZ2UgRk1FKSwgdXNpbmcgdGhlIE5lbGRlci1NZWFkIGFsZ29yaXRobS4gVGhlIGJlc3Qgc2V0IG9mIHBhcmFtZXRlcnMgZm91bmQgYnkgbW9kRml0IHdhcyB0aGVuIHVzZWQgYXMgdGhlIGlucHV0IHRvIGEgTW9udGUgQ2FybG8gTWFya292IENoYWluIChNQ01DKSwgdXNpbmcgdGhlIGZ1bmN0aW9uICJtb2RNQ01DIiAoUiBwYWNrYWdlIEZNRSkuIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGhlIE1DTUMgb3B0aW1pemF0aW9uIHdhcyBzZXQgYXQgNTAwMCBpbnRpYWxseSwgd2l0aCBkZWxheWVkIHJlamVjdGlvbiBlbXBsb3llZCB0byBpbmNyZWFzZSBlZmZpY2llbmN5LiAKClRoZSBzdW0gb2YgdGhlIG1lYW4gc3F1YXJlZCBlcnJvciBmb3IgdGhlIGJlc3QgcGFyYW1ldGVyIHNldCB3YXMgc2xpZ2h0bHkgbG93ZXIgZm9yIHRoZSBwYXJhbGxlbCBzdHJ1Y3R1cmUgdGhhbiBmb3IgdGhlIHNlcmllcyBzdHJ1Y3R1cmUuIEFkZGl0aW9uYWxseSwgdGhlIG92ZXJhbGwgbWVhbiBlcnJvciBvZiB0aGUgcmVzaWR1YWxzIHdhcyBhbHNvIGxvd2VyIGZvciB0aGUgcGFyYWxsZWwgc3RydWN0dXJlLCBtb2RlcmF0ZWx5IHNvIGZvciB0aGUgYnVsayBDIG9ic2VydmF0aW9ucyBidXQgc3Vic3RhbnRpYWxseSBzbyBmb3IgdGhlIHJlc3BpcmF0aW9uIG9ic2VydmF0aW9ucyAoaW4gYW5kZXNpdGUgYW5kIGdyYW5pdGUgc29pbHMgaW4gcGFydGljdWxhcikuCgpIb3dldmVyLCB0aGVzZSBpbml0aWFsIGZpdHMgeWllbGRlZCB1bnJlYWxpc3RpYyBwYXJhbWV0ZXIgZXN0aW1hdGVzIGZvciBtdWx0aXBsZSBzaXRlcywgcGFydGljdWxhcmx5IGF0IHRoZSBsb3dlciBkZXB0aHMuIEFkZGl0aW9uYWxseSwgdGhlIG1vZEZpdCBvdXRwdXQgc2hvd2VkIHZlcnkgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXJzIGZvciBib3RoIG1vZGVsIHN0cnVjdHVyZXMgKHNsaWdodGx5IGhpZ2hlciBmb3IgdGhlIHR3by1wb29sIHNlcmllcyBtb2RlbCkuIAoKYGBge3IgbW9kLXV0aWxzfQojIGsgZnJvbSBmcmFjdGlvbiBtb2Rlcm4KayA8LSBmdW5jdGlvbiAoRm0pIHsKICAoRm0gKiBsYW1iZGEpLygxIC0gRm0pCn0KCiMgZDE0QyBmcm9tIGZyYWN0aW9uIG1vZGVybiAKZm1fMTRjIDwtIGZ1bmN0aW9uIChmbSwgZGF0ZSkgewogIChmbSAqIGV4cChsYW1iZGEgKiAoMTk1MCAtIGRhdGUpKSAtIDEpICogMTAwMAp9CgojIHByZS1ib21iIGZyYWN0aW9uIG1vZGVybiBmcm9tIGsgKHN0ZWFkeS1zdGF0ZSBhc3N1bWVkKQpmbSA8LSBmdW5jdGlvbiAoayl7CiAgay8oayArIGxhbWJkYSkKfQpgYGAKCmBgYHtyIG1vZC1jb25zdHJhaW50cywgaW5jbHVkZSA9IEZBTFNFfQojIEluZGljZXMgZm9yIGVhY2ggZGVwdGggaW5jcmVtZW50Cml4LjEwIDwtIHNlcSgxLCAyNywgMykKaXguMjAgPC0gc2VxKDIsIDI3LCAzKQppeC4zMCA8LSBzZXEoMywgMjcsIDMpCgojIyBTT0Mgc3RvY2tzCiMgdXNlIDIwMTkgU09DIHN0b2NrcyBmb3Igc3RlYWR5LXN0YXRlIGVzdGltYXRlcwpjc29jLjE5LjBfMzAuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcmEuMjAxOS5zcC5scywgZnVuY3Rpb24oZGYpIHsKICAgIGRmIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgIGRmICU+JQogICAgICAgIGZpbHRlcihseXJfYm90IDwgMzEgJiBseXJfYm90ID4gMCkgJT4lCiAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfdG9wLCBseXJfYm90LCBseXJfc29jKSAlPiUKICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkpCiAgICByZXR1cm4oZGF0YS5mcmFtZShkZikpCiAgfSkKKQojIHdyaXRlLmNzdihjc29jLjE5LjBfMzAuZGYsICJjc29jLjE5LjBfMzAuY3N2IikKCiMgY29udmVydCB0byAyNyBlbGVtZW50IGxpc3QKY3NvYy4xOS4wXzMwLmxzIDwtIHNwbGl0KGNzb2MuMTkuMF8zMC5kZiwgcGFzdGUwKGNzb2MuMTkuMF8zMC5kZiRQTWVjbywgIl8iLCBjc29jLjE5LjBfMzAuZGYkbHlyX3RvcCwgIi0iLCBjc29jLjE5LjBfMzAuZGYkbHlyX2JvdCkpCgojIGF2ZXJhZ2UKY3NvYy4xOS4wXzMwIDwtIGxhcHBseShjc29jLjE5LjBfMzAubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGF0YS5mcmFtZSgKICAgIGRmICU+JQogICAgICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgICAgIHN1bW1hcml6ZShseXJfc29jID0gbWVhbihseXJfc29jKSkpCn0pCgojIG1ha2UgaW50byBvYnMgZGF0YSBmcmFtZSBmb3IgbW9kLmNvc3QgZngKb2JzLmNTdG9jayA8LSBsYXBwbHkoY3NvYy4xOS4wXzMwLmxzLCBmdW5jdGlvbihkZikgewogIHJldHVybihkYXRhLmZyYW1lKHRpbWUgPSByZXAoYygyMDAxLjUsIDIwMDkuNSwgMjAxOS41KSwgZWFjaCA9IDMpLCBjU3RvY2sgPSByZXAoZGYkbHlyX3NvYywgMykpKQp9KQoKIyMgSW5wdXRzCiMgaW5pdGlhbCBpbnB1dHMgd2lsbCBiZSBzZXQgYXQgNCUgb2YgdGhlIGxheWVyIGNhcmJvbiBzdG9ja3MgKGFyYml0cmFyeSkKaW4uaSA8LSBsYXBwbHkoY3NvYy4xOS4wXzMwLCBmdW5jdGlvbih4KSAuMDQgKiB4JGx5cl9zb2MpCiMgSW5wdXRzIHdpbGwgYmUgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGZpdHRlZCBwYXJhbWV0ZXJzIHRvIG1hdGNoIG1lYXN1cmVkIHN0b2NrcyBsYXRlcgoKIyMgMTRDIGNvbnN0cmFpbnRzCiMgYnVsawpvYnMuYnVsay4xNGMgPC0gdW5saXN0KAogIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLnJlcC5scyksIGZ1bmN0aW9uKGkpIHsKICAjIGluZGV4IGFsb25nIGRlcHRoIGludGVydmFscyAwLTEwLCAxMC0yMCwgMjAtMzAKICBkZXB0aC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKDE6MyksIGZ1bmN0aW9uKGopIHsKICAgIGModW5saXN0KGxhcHBseShzcmEuMTkuMDEucmVwLmxzW1tpXV0sICJbWyIsIGopKSwKICAgICAgc3BsaXQoc3BsaXQoc3JhLjE5LjAxLjA5LCBzcmEuMTkuMDEuMDkkUE1lY28pW1tpXV0sCiAgICAgICAgICAgIHNwbGl0KHNyYS4xOS4wMS4wOSwgc3JhLjE5LjAxLjA5JFBNZWNvKVtbaV1dWyJseXJfYm90Il0pW1tqXV1bICwgImZtIl1bMl0sCiAgICAgIHVubGlzdChzcGxpdChzcmEuMjAxOS5sc1tbaV1dLCBzcmEuMjAxOS5sc1tbaV1dWyJseXJfYm90Il0pW1tqXV1bImZtIl0pKQogIH0pCiAgcmVwczAxIDwtIGxlbmd0aChzcmEuMTkuMDEucmVwLmxzW1tpXV0pCiAgZGVwdGguZGZzIDwtIGxhcHBseShkZXB0aC5scywgZnVuY3Rpb24oZm0pIHsKICAgIGRhdGEuZnJhbWUodGltZSA9IGMocmVwKDIwMDEuNSwgcmVwczAxKSwgMjAwOS41LCByZXAoMjAxOS41LCAzKSksCiAgICAgICAgICAgICAgIGJ1bGtDID0gRGVsdGExNENfZnJvbV9BYnNvbHV0ZUZyYWN0aW9uTW9kZXJuKGZtKSkKICB9KQogIHJldHVybihkZXB0aC5kZnMpCn0pLCByZWN1cnNpdmUgPSBGQUxTRSkKbmFtZXMob2JzLmJ1bGsuMTRjKSA8LSBwYXN0ZTAocmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhY2ggPSA5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoInBwIiwgInJmIiwgIndmIiksIGVhY2ggPSAzLCB0aW1lcyA9IDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoYygiXzAtMTAiLCAiXzEwLTIwIiwgIl8yMC0zMCIpLCB0aW1lcyA9IDkpKQpzYXZlKG9icy5idWxrLjE0YywgZmlsZSA9ICJvYnMuYnVsay4xNGMuUkRhdGEiKQoKIyByZXNwaXJhdGlvbgpzcmEuMTkuMDEuaW5jLm1pbi5tYXggPC0gdW5saXN0KAogIGxhcHBseShzZXFfYWxvbmcoMTozKSwgZnVuY3Rpb24oaSkgewogICAgbGFwcGx5KAogICAgICBtYXBwbHkobWVyZ2UsCiAgICAgICAgICAgICBsYXBwbHkobGFwcGx5KHNyYS4xOS4wMS5pbmMubHMsICJbWyIsIDIpLCAiW1siLCBpKSwgCiAgICAgICAgICAgICBsYXBwbHkobGFwcGx5KHNyYS4xOS4wMS5pbmMubHMsICJbWyIsIDMpLCAiW1siLCBpKSwKICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpLAogICAgICBmdW5jdGlvbihkZikgewogICAgICAgIGRhdGEuZnJhbWUodGltZSA9IDIwMDEuNSwgcmVzcCA9IGMoZGYkeCwgZGYkeSkpCiAgICAgIH0pCiAgfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQpuYW1lcyhzcmEuMTkuMDEuaW5jLm1pbi5tYXgpIDwtIHBhc3RlMChuYW1lcyhzcmEuMTkuMDEuaW5jLm1pbi5tYXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoIl8wLTEwIiwgIl8xMC0yMCIsICJfMjAtMzAiKSwgZWFjaCA9IDkpKQpzcmEuMTkuMDEuaW5jLm1pbi5tYXggPC0gbGFwcGx5KHNyYS4xOS4wMS5pbmMubWluLm1heCwgZnVuY3Rpb24oZGYpIHsKICBkZiRyZXNwIDwtIGNhbGNfMTRjKGRmJHJlc3AsIDIwMDEpCiAgcmV0dXJuKGRmKQp9KQoKc3JhLjIwMTkuaW5jLm1pbi5tYXggPC0gdW5saXN0KGxhcHBseShzcmEuMjAxOS5pbmMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRseXJfYm90KSwgZnVuY3Rpb24oeCkgewogICAgeCRyZXNwIDwtIHgkZDE0YwogICAgeCR0aW1lIDwtIHgkWWVhciArIC41CiAgICByZXR1cm4oeFsgLCBjKCJ0aW1lIiwgInJlc3AiKV0pCiAgfSkKfSksIHJlY3Vyc2l2ZSA9IEZBTFNFKQpuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heCkgPC0gZ3N1YigiXFwuIiwgIl8iLCBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heCkpCmZvciAoaSBpbiBzZXFfYWxvbmcobmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpKSkgewogIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSA8LSBpZmVsc2UoZ3JlcGwoIjEwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCIxMCIsICIwLTEwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIjIwIiwgbmFtZXMoc3JhLjIwMTkuaW5jLm1pbi5tYXgpW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiMjAiLCAiMTAtMjAiLCBuYW1lcyhzcmEuMjAxOS5pbmMubWluLm1heClbaV0pLCBnc3ViKCIzMCIsICIyMC0zMCIsIG5hbWVzKHNyYS4yMDE5LmluYy5taW4ubWF4KVtpXSkpKQp9CgpvYnMucmVzcC4xNGMgPC0gcmJpbmQoYmluZF9yb3dzKHNyYS4xOS4wMS5pbmMubWluLm1heCwgLmlkID0gImlkIiksCiAgICAgICAgICAgICAgICAgICAgICBiaW5kX3Jvd3Moc3JhLjIwMTkuaW5jLm1pbi5tYXgsIC5pZCA9ICJpZCIpKQpvYnMucmVzcC4xNGMgPC0gbGFwcGx5KHNwbGl0KG9icy5yZXNwLjE0Yywgb2JzLnJlc3AuMTRjJGlkKSwgZnVuY3Rpb24oZGYpIGRmWyAsIDI6M10pCgpzYXZlKG9icy5yZXNwLjE0YywgZmlsZSA9ICJvYnMucmVzcC4xNGMuUkRhdGEiKQoKIyMgaW5wdXQvc3RvY2sgcmF0aW8KcmFzMDYgPC0gZGF0YS5mcmFtZShyZWFkX2V4Y2VsKCIuLi9kYXRhL2V4dGVybmFsL3NyYV9yYXNfaW5jL1Jlc3BSYXRlc19SYXNtdXNzZW4yMDA2Lnhsc3giLCBzaGVldCA9ICJSYXRlc1N1bSIpKQojIE9icyBjb3N0Cm9icy5mbHguc3RvY2sgPC0gbGFwcGx5KHNwbGl0KHJhczA2LCByYXMwNiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICBkYXRhLmZyYW1lKHRpbWUgPSAyMDAxLjUsICMgYXJiaXRyYXJ5CiAgICAgICAgICAgICBmbHguc3RvY2sgPSB4WyAsICJmbHhfc3RvY2tfcmF0aW8iXSkKfSkKCiMgY2FsY3VsYXRlIGlucHV0cyB1c2luZyBmbHgvc3RvY2sgcmF0aW8KaW4uZmx4LnN0b2NrIDwtIGxhcHBseShzZXFfYWxvbmcob2JzLmZseC5zdG9jayksIGZ1bmN0aW9uKGkpIHsKICBvYnMuZmx4LnN0b2NrW1tpXV1bWyJmbHguc3RvY2siXV0vY3NvYy4xOS4wXzMwW2l4LjEwXVtbaV1dW1sibHlyX3NvYyJdXQp9KQoKIyBGbHV4IGVzdGltYXRlZCBmcm9tIEdvdWxkZW4gZXQgYWwuIDIwMTI7IFRhbmcgZXQgYWwuIDIwMDU7IFdhbmcgZXQgYWwuIDIwMDA7IEdhdWRpbnNraSAyMDAwCiMgZmx1eGVzIGJ5IGVsZXZhdGlvbiBmcm9tIEdQUCByZXBvcnRlZCBpbiBHb3VsZGVuIGV0IGFsLiBGaWcuIDUgYW5kIGFwcHJveGltYXRlZAojIFJoIHBlcmNlbnRhZ2UgZnJvbSBUYW5nIGV0IGFsLiAyMDA1ID0gMC40NCAoYW5uLiBtZWFuIEJsb2RnZXR0KTsgY2YuIDAuNDggSGFydmFyZCBGb3Jlc3QKIyBBIGhvcml6b24gZXN0LiAwLjU1IGZyb20gR2F1ZGluc2tpCiMgYXNzdW1pbmcgQSA9IDAtMzAsIGFzc3VtZSAwLTEwID0gNTAlLCAxMC0yMCA9IDMwJSwgMjAtMzAgPSAyMCUgb2YgdG90YWwgQSBwcm9kdWN0aW9uIApoem5BLlJoLmtnbTIgPC0gMC40NCAqIDAuNTUgKiAxMF4tMwpncHAubHMgPC0gYygxODAwLCAxNjAwLCAxNDAwKQppbi5mcmMubHMgPC0gYygwLjUsIDAuMywgMC4yKQoKIyBmeCBmb3IgY2FsY3VsYXRpbmcgaW5wdXRzCmluLmZseC5meCA8LSBmdW5jdGlvbihQTWVjb19kZXB0aCkgewogIGdwcCA8LSBpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY29fZGVwdGgpLCBncHAubHNbMV0sIGlmZWxzZShncmVwbCgid2YiLCBQTWVjb19kZXB0aCksIGdwcC5sc1syXSwgZ3BwLmxzWzNdKSkKICBpbi5mcmMgPC0gaWZlbHNlKGdyZXBsKCIwLTEwIiwgUE1lY29fZGVwdGgpLCBpbi5mcmMubHNbMV0sIGlmZWxzZShncmVwbCgiMTAtMjAiLCBQTWVjb19kZXB0aCksIGluLmZyYy5sc1syXSwgaW4uZnJjLmxzWzNdKSkKICByZXR1cm4oZ3BwICogaW4uZnJjICogaHpuQS5SaC5rZ20yKQp9CgojIGlucHV0IGxpc3QKaW4uZXN0IDwtIGxhcHBseShzZXFfYWxvbmcob2JzLmNTdG9jayksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhvYnMuY1N0b2NrKVtpXQogIHJldHVybihpbi5mbHguZngoUE1lY29fZGVwdGgpKQp9KQpuYW1lcyhpbi5lc3QpIDwtIG5hbWVzKG9icy5jU3RvY2spCmBgYAoKYGBge3IgbW9kLWZ1bnMtZ2VufQojIGluZGV4IG9mIHllYXJzIGZvciB3aGljaCBidWxrL3Jlc3AgMTRDIGFyZSBrbm93bgp5ZWFyLml4IDwtIGMod2hpY2goRGF0bSREYXRlID09IDIwMDEuNSksCiAgICAgICAgICAgICB3aGljaChEYXRtJERhdGUgPT0gMjAwOS41KSwKICAgICAgICAgICAgIHdoaWNoKERhdG0kRGF0ZSA9PSAyMDE5LjUpKQoKIyBmdW5jdGlvbiBmb3Igc2F2aW5nIGNvbnN0cmFpbnQgZGF0YSBpbiBhIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgaW4gZ2dwbG90Jwpjb24uZGYuZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgpIHsKICBidWxrLmRmIDwtIG9icy5idWxrLjE0Y1tbUE1lY29fZGVwdGhdXQogIHJlc3AuZGYgPC0gb2JzLnJlc3AuMTRjW1tQTWVjb19kZXB0aF1dCiAgcmV0dXJuKAogICAgY29uLmRmIDwtIGRhdGEuZnJhbWUocG9vbCA9IGMocmVwKCJidWxrIEMiLCBucm93KGJ1bGsuZGYpKSwgcmVwKCJyZXNwaXJhdGlvbiIsIG5yb3cocmVzcC5kZikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGQxNGMgPSBjKGJ1bGsuZGYkYnVsa0MsIHJlc3AuZGYkcmVzcCksCiAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYyhidWxrLmRmJHRpbWUsIHJlc3AuZGYkdGltZSkpKQp9CgojIHBsb3QgZnVuY3Rpb24KQzE0LjJwLnBsb3QuZnggPC0gZnVuY3Rpb24ocGxvdC5kZiwgY29uLmRmLCBtb2QsIHBvb2xfZmx0ciA9ICJidWxrICYgcmVzcCIsIFBNZWNvX2RlcHRoKSB7CiAgCiAgaWYgKHBvb2xfZmx0ciA9PSAiYnVsayAmIHJlc3AiKSB7CiAgICBwbG90LmRmIDwtIHBsb3QuZGYgJT4lCiAgICAgIGZpbHRlcihwb29sID09ICJidWxrIEMiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iIHwgcG9vbCA9PSAiYXRtIikKICB9CiAgCiAgcCA8LSBnZ3Bsb3QocGxvdC5kZiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgICBnZW9tX3BvaW50KGRhdGEgPSBjb24uZGYsIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBvb2wpLCBzaXplID0gMykgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICBuYW1lID0gIlBvb2wiLAogICAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgICAiYnVsayBDIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiwKICAgICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICAgIGdndGl0bGUocGFzdGUoUE1lY29fZGVwdGgsIG1vZCkpICsKICAgIHhsYWIoIlllYXIiKSArCiAgICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogIAogIGlmIChwb29sX2ZsdHIgIT0gImJ1bGsgJiByZXNwIikgewogICAgcCArIAogICAgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gcG9vbCkpICsKICAgICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiUG9vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhdG0iID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bGsgQyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFzdCIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xvdyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gMSkpCiAgfSBlbHNlIHsKICAgIHAgKwogICAgICBnZW9tX3BhdGgoKQogIH0KfQpDMTQuMXAucGxvdC5meCA8LSBmdW5jdGlvbihwbG90LmRmLCBjb24uZGYsIG1vZCwgUE1lY29fZGVwdGgpIHsKICBnZ3Bsb3QocGxvdC5kZiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wYXRoKCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJQb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiYnVsayBDIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBnZ3RpdGxlKHBhc3RlKFBNZWNvX2RlcHRoLCAiIDFwIGJ1bGsgKyAxcCByZXNwIikpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKfQoKIyBzZXQgdXAgbW9kZWwgZnVuY3Rpb24gZm9yIG9wdGltaXphdGlvbgojIE5PVEU6IHBhclszXSBmb3IgMnBzIG1vZGVsIGNoYW5nZWQgdG8gcHJvcG9ydGlvbiB0cmFuc2ZlcnJlZCAobm8gbG9uZ2VyID0gYTIxKQojIHRoZXJlZm9yZSwgYTIxID0gcGFyWzNdICogcGFyWzFdCm1vZEZ1bl8ycCA8LSBmdW5jdGlvbihwYXJzLCBJbiwgbGFnID0gMCwgcGFzcyA9IFRSVUUsIG91dCA9ICJtb2RGaXQiLCBtb2QpIHsKIAogICMgaW50aWFsIDE0QwogIEYwX0RlbHRhMTRDIDwtIHVubGlzdChsYXBwbHkocGFyc1sxOjJdLCBmdW5jdGlvbih4KSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oeCkpKSkKICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLWRpYWcocGFyc1sxOjJdKQogIGlmIChtb2QgPT0gIjJwcyIpIHsKICAgIGEyMSA8LSBwYXJzWzNdICogcGFyc1sxXQogICAgQVsyLCAxXSA8LSBhMjEKICB9CiAgICAKICAjIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgIHNzLmNzdG9jayA8LSAoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiAqIHBhcnNbM10sIEluICogKDEgLSBwYXJzWzNdKSkpCiAgfSBlbHNlIHsKICAgIHNzLmNzdG9jayA8LSAoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiwgMCkpCiAgfQogIAogICMgdGltZSBpbmRleAogIGl4LnQgPC0gYygobGFnICsgMSk6bnJvdyhEYXRtKSkKICAKICAjIG1vZGVsCiAgaWYgKG1vZCA9PSAiMnBwIikgewogICAgbW9kIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gcGFyc1sxOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzAgPSBjKHNzLmNzdG9ja1sxXSwgc3MuY3N0b2NrWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gcGFyc1szXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmMgPSBEYXRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHBhc3MpCiAgfSBlbHNlIHsKICAgIG1vZCA8LSBUd29wU2VyaWVzTW9kZWwxNCh0ID0gRGF0bSREYXRlW2l4LnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gcGFyc1sxOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhzcy5jc3RvY2tbMV0sIHNzLmNzdG9ja1syXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjBfRGVsdGExNEMgPSBGMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyMSA9IGEyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZjID0gRGF0bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHBhc3MpCiAgfQogIAogICMgZ2V0IG1vZCB2YWx1ZXMKICBDMTRtIDwtIGdldEYxNEMobW9kKQogIEMxNHAgPC0gZ2V0RjE0KG1vZCkKICBDMTRyIDwtIGdldEYxNFIobW9kKQogIEN0b3QgPC0gZ2V0Qyhtb2QpCiAgCiAgaWYob3V0ID09ICJtb2RGaXQiKSB7CiAgICAjIGRhdGFmcmFtZSBmb3IgbW9kRml0IGZ4CiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgdGltZSA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgYnVsa0MgPSBDMTRtLCAKICAgICAgcmVzcCA9IEMxNHIsCiAgICAgIGNTdG9jayA9IHJvd1N1bXMoQ3RvdCkpKQogIH0gZWxzZSB7CiAgICAjIGRhdGEgZnJhbWUgZm9yIHBsb3R0aW5nCiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgeWVhcnMgPSByZXAoRGF0bSREYXRlW2l4LnRdLCA1KSwKICAgICAgZDE0QyA9IGMoQzE0cFssMV0sIAogICAgICAgICAgICAgICBDMTRwWywyXSwgCiAgICAgICAgICAgICAgIEMxNG0sCiAgICAgICAgICAgICAgIEMxNHIsCiAgICAgICAgICAgICAgIERhdG0kTkhjMTRbaXgudF0pLAogICAgICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJidWxrIEMiLCAicmVzcGlyYXRpb24iLCAiYXRtIiksIGVhY2ggPSBucm93KEMxNHApKSkpCiAgfQp9CgojIDFwIG1vZEZ1bgptb2RGdW5fMXAgPC0gZnVuY3Rpb24ocGFycywgSW4sIGxhZyA9IDAsIG91dCA9ICJtb2RGaXQiLCBtb2QsIHBhc3MgPSBUUlVFKSB7CiAKICAjIGludGlhbCAxNEMKICBGMF9EZWx0YTE0QyA8LSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0ocGFycykpCiAgCiAgIyBzdGVhZHktc3RhdGUgQyBzdG9ja3MKICBzcy5jc3RvY2sgPC0gSW4vcGFycwogIAogICMgdGltZSBpbmRleAogIGl4LnQgPC0gYygobGFnICsgMSk6bnJvdyhEYXRtKSkKICAKICAjIG1vZGVsCiAgbW9kIDwtIHN1cHByZXNzV2FybmluZ3MoCiAgICAjIHdhcm5pbmdzIHN1cHByZXNzZWQgZHVlIHRvIHRoZSAiRmMiIHdhcm5pbmcKICAgIE9uZXBNb2RlbDE0KHQgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgICAgICAgICAgICAgICAgIGsgPSBwYXJzLAogICAgICAgICAgICAgICAgICAgICBDMCA9IHNzLmNzdG9jaywKICAgICAgICAgICAgICAgICAgICAgRjBfRGVsdGExNEMgPSBGMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgSW4gPSBJbiwKICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgICAgICAgICAgICAgICAgIGxhZyA9IGxhZywKICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHBhc3MpCiAgKQogIAogICMgZ2V0IG1vZCB2YWx1ZXMKICBDMTRtIDwtIGdldEYxNEMobW9kKQogIEN0b3QgPC0gZ2V0Qyhtb2QpCiAgCiAgaWYob3V0ID09ICJtb2RGaXQiKSB7CiAgICAjIGRhdGFmcmFtZSBmb3IgbW9kRml0IGZ4CiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgdGltZSA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgYnVsa0MgPSBDMTRtLAogICAgICBjU3RvY2sgPSBDdG90KSkKICB9IGVsc2UgewogICAgIyBkYXRhIGZyYW1lIGZvciBwbG90dGluZwogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHllYXJzID0gcmVwKERhdG0kRGF0ZVtpeC50XSwgMSksCiAgICAgIGQxNEMgPSBjKEMxNG0sCiAgICAgICAgICAgICAgIERhdG0kTkhjMTRbaXgudF0pLAogICAgICBwb29sID0gcmVwKGMoImJ1bGsgQyIsICJhdG0iKSwgZWFjaCA9IGxlbmd0aChDMTRtKSkpKQogIH0KfQoKIyBmdW5jdGlvbiBmb3IgdHJpYWwgYW5kIGVycm9yIGFwcHJvYWNoIHRvIGZpbmRpbmcgaW5pdGlhbCBwYXJhbWV0ZXIgc2V0CnBhci5meCA8LSBmdW5jdGlvbihwYXJzLCBJbiwgbGFnID0gMCwgb3V0ID0gInBsb3QuZGYiLCB2ZXJib3NlID0gVFJVRSwgbW9kLCBwYXNzID0gRkFMU0UpIHsKICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLWRpYWcocGFyc1sxOjJdKQogIGlmIChtb2QgPT0gIjJwcyIpIHsKICAgIGEyMSA8LSBwYXJzWzNdICogcGFyc1sxXQogICAgQVsyLCAxXSA8LSBhMjEKICAgICMgc3RlYWR5LXN0YXRlIHN0b2NrcwogICAgc3MuY3N0b2NrIDwtIHJvdW5kKCgtMSAqIHNvbHZlKEEpICUqJSBjKEluLCAwKSksIDEpCiAgfSBlbHNlIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgICMgc3RlYWR5LXN0YXRlIHN0b2NrcwogICAgc3MuY3N0b2NrIDwtIHJvdW5kKCgtMSAqIHNvbHZlKEEpICUqJSBjKEluICogcGFyc1szXSwgSW4gKiAoMSAtIHBhcnNbM10pKSksIDEpCiAgfSBlbHNlIHsKICAgIHNzLmNzdG9jayA8LSBJbi9wYXJzCiAgfQogIAogIGNzdG9jay5zdW0gPC0gaWZlbHNlKGxlbmd0aChzcy5jc3RvY2spID09IDEsIHNzLmNzdG9jaywgY29sU3Vtcyhzcy5jc3RvY2spKQogIAogICMgcHJpbnQgc2l0ZSBhbmQgc3RlYWR5LXN0YXRlIHN0b2NrcwogIGlmICh2ZXJib3NlKSB7CiAgICBjYXQocGFzdGUwKFBNZWNvX2RlcHRoLCAiXG4iKSkKICAgIGlmIChtb2QgPT0gIjJwcyIgfCBtb2QgPT0gIjJwcCIpIHsKICAgICAgY2F0KHBhc3RlMChzcy5jc3RvY2tbMV0sICIgKGZhc3QgcG9vbClcbiIsIHNzLmNzdG9ja1syXSwgIiAoc2xvdyBwb29sKVxuIikpCiAgICAgIGNhdChwYXN0ZTAoInNsb3cgcG9vbDogIiwgcm91bmQoc3MuY3N0b2NrWzJdIC8gY3N0b2NrLnN1bSAqIDEwMCwgMCksICIlXG4iKSkgCiAgICB9CiAgICBjYXQocm91bmQoY3N0b2NrLnN1bSwgMSksICIgKG1vZGVsZWQgc3RvY2tzKVxuIikKICAgIGNhdChyb3VuZChjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwgImx5cl9zb2MiXSwgMSksICIgKG1lYXN1cmVkIHN0b2NrcylcbiIpIAogIH0KICBpZiAobW9kID09ICIxcCIpIHsKICAgIHJldHVybihtb2RGdW5fMXAocGFycyA9IHBhcnMsIEluID0gSW4sIGxhZyA9IGxhZywgb3V0ID0gb3V0LCBtb2QgPSAiMXAiLCBwYXNzID0gcGFzcykpCiAgfQogIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgcmV0dXJuKG1vZEZ1bl8ycChwYXJzID0gcGFycywgSW4gPSBJbiwgbGFnID0gbGFnLCBvdXQgPSBvdXQsIG1vZCA9ICIycHAiLCBwYXNzID0gcGFzcykpIAogIH0gZWxzZSBpZiAobW9kID09ICIycHMiKSB7CiAgICByZXR1cm4obW9kRnVuXzJwKHBhcnMgPSBwYXJzLCBJbiA9IEluLCBsYWcgPSBsYWcsIG91dCA9IG91dCwgbW9kID0gIjJwcyIsIHBhc3MgPSBwYXNzKSkgCiAgfQp9CmBgYAoKYGBge3IgaW5wdXRzLXN0b2Nrc30KIyMgYWRqdXN0IGlucHV0cyB0byBtYXRjaCBzdG9ja3MKIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgc3RlYWR5LXN0YXRlIFNPQyBzdG9ja3MKc29jLmZ4IDwtIGZ1bmN0aW9uKG1vZFN0ciwgcGFycywgSW4sIG91dCA9ICJwb29scyIpIHsKICBpZiAobW9kU3RyID09ICIycHAiKSB7CiAgICBjbWF0IDwtIC0xICogc29sdmUoLWRpYWcocGFyc1sxOjJdKSkgJSolIGMoSW4gKiBwYXJzWzNdLCBJbiAqICgxIC0gcGFyc1szXSkpCiAgfSBlbHNlIHsKICAgIEEgPC0gLWRpYWcocGFyc1sxOjJdKQogICAgQVsyLCAxXSA8LSBwYXJzWzNdICMgbm90ZSB0aGF0IGEyMSBkZWZpbmVkIGFzIHBjdCB0cmFuc2ZlciAqIGsxCiAgICBjbWF0IDwtIC0xICogc29sdmUoQSkgJSolIGMoSW4sIDApICMgSW4gaXMgdG90YWwgaW5wdXQgaW50byB0aGUgc3lzdGVtCiAgfQogIGlmIChvdXQgPT0gInBvb2xzIikgewogICAgcmV0dXJuKGNtYXQpCiAgfSBlbHNlIHsKICAgIHJldHVybihjb2xTdW1zKGNtYXQpKQogIH0KfQoKaW4uZml0LmZ4IDwtIGZ1bmN0aW9uKG1vZFN0ciwgcGFycywgaW5pdGlhbEluLCBTT0MpIHsKICAjIHNlcXVlbmNlIG9mIHBvc3NpYmxlIGlucHV0IHZhbHVlcwogIGlmICAoU09DIDwgc29jLmZ4KG1vZFN0ciwgcGFycywgaW5pdGlhbEluLCBvdXQgPSAic3VtIikpIHsKICAgIGlucyA8LSBzZXEoLjAxLCAKICAgICAgICAgICAgICAgaW5pdGlhbEluLCAKICAgICAgICAgICAgICAgLjAxKQogICAgfSBlbHNlIHsKICAgICAgaW5zIDwtIHNlcShpbml0aWFsSW4sIAogICAgICAgICAgICAgICAgIFNPQywgCiAgICAgICAgICAgICAgICAgLjAxKQogICAgfQogICMgbW9kZWxlZCBzdG9ja3MKICBzb2NfbW9kIDwtIGxhcHBseShzZXFfYWxvbmcoaW5zKSwgZnVuY3Rpb24oaikgewogICAgc29jLmZ4KG1vZFN0ciwgcGFycywgaW5zW2pdLCBvdXQgPSAic3VtIikKICB9KQogIGl4IDwtIHdoaWNoLm1pbihhYnModW5saXN0KHNvY19tb2QpIC0gU09DKSkKICByZXR1cm4oaW5zW2l4XSkKfQoKIyBsb2FkIGluaXRpYWwgcGFyYW1ldGVyIHNldApsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwcF8yMDIxLTAzLTMwLlJkYXRhIikKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHNfMjAyMC0xMS0xNi5SZGF0YSIpCgojIyBpbnB1dHMgZm9yIGluaXRpYWwgcGFyIHNldCBhbmQgbWVhc3VyZWQgc3RvY2tzCiMgMnBwCmluLm1lYXMuMnBwIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5pLjJwcFtpeC4xMF0pLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5pLjJwcFtpeC4xMF0pW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHAiLCBwYXJzLmkuMnBwW2l4LjEwXVtbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5tZWFzLjJwcCkgPC0gbmFtZXMocGFycy5pLjJwcFtpeC4xMF0pCiMgMnBzCmluLm1lYXMuMnBzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5pLjJwc1tpeC4xMF0pLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5pLjJwc1tpeC4xMF0pW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KCIycHAiLCBwYXJzLmkuMnBzW2l4LjEwXVtbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5tZWFzLjJwcykgPC0gbmFtZXMocGFycy5pLjJwc1tpeC4xMF0pCgojIEZsdXggZXN0aW1hdGVkIGZyb20gR291bGRlbiBldCBhbC4gMjAxMjsgVGFuZyBldCBhbC4gMjAwNTsgV2FuZyBldCBhbC4gMjAwMDsgR2F1ZGluc2tpIDIwMDAKIyBmbHV4ZXMgYnkgZWxldmF0aW9uIGZyb20gR1BQIHJlcG9ydGVkIGluIEdvdWxkZW4gZXQgYWwuIEZpZy4gNSBhbmQgYXBwcm94aW1hdGVkCiMgUmggcGVyY2VudGFnZSBmcm9tIFRhbmcgZXQgYWwuIDIwMDUgPSAwLjQ0IChhbm4uIG1lYW4gQmxvZGdldHQpOyBjZi4gMC40OCBIYXJ2YXJkIEZvcmVzdAojIEEgaG9yaXpvbiBlc3QuIDAuNTUgZnJvbSBHYXVkaW5za2kKIyBhc3N1bWluZyBBID0gMC0zMCwgYXNzdW1lIDAtMTAgPSA1MCUsIDEwLTIwID0gMzAlLCAyMC0zMCA9IDIwJSBvZiB0b3RhbCBBIHByb2R1Y3Rpb24gCmh6bkEuUmgua2dtMiA8LSAwLjQ0ICogMC41NSAqIDEwXi0zCmdwcC5scyA8LSBjKDE4MDAsIDE2MDAsIDE0MDApCmluLmZyYy5scyA8LSBjKDAuNSwgMC4zLCAwLjIpCgojIGZ4IGZvciBjYWxjdWxhdGluZyBpbnB1dHMKaW4uZmx4LmZ4IDwtIGZ1bmN0aW9uKFBNZWNvX2RlcHRoKSB7CiAgZ3BwIDwtIGlmZWxzZShncmVwbCgicHAiLCBQTWVjb19kZXB0aCksIGdwcC5sc1sxXSwgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvX2RlcHRoKSwgZ3BwLmxzWzJdLCBncHAubHNbM10pKQogIGluLmZyYyA8LSBpZmVsc2UoZ3JlcGwoIjAtMTAiLCBQTWVjb19kZXB0aCksIGluLmZyYy5sc1sxXSwgaWZlbHNlKGdyZXBsKCIxMC0yMCIsIFBNZWNvX2RlcHRoKSwgaW4uZnJjLmxzWzJdLCBpbi5mcmMubHNbM10pKQogIHJldHVybihncHAgKiBpbi5mcmMgKiBoem5BLlJoLmtnbTIpCn0KCiMgaW5wdXQgbGlzdAppbi5lc3QgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmkuMnBwKSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuaS4ycHApW2ldCiAgcmV0dXJuKGluLmZseC5meChQTWVjb19kZXB0aCkpCn0pCm5hbWVzKGluLmVzdCkgPC0gbmFtZXMocGFycy5pLjJwcCkKYGBgCiMjIFBhcmFtZXRlciBvcHRpbWl6YXRpb24KCk9wdGltaXppbmcgdGhlIHBhcmFtZXRlciBzZXQgcmVxdWlyZXMgaW1wb3NpbmcgY29zdHMgYW5kIG9wdGlvbmFsbHkgY29uc3RyYWluaW5nIHRoZSBhbGxvd2FibGUgcmFuZ2Ugb2YgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlci4gR2l2ZW4gdGhhdCB3ZSBvbmx5IGhhdmUgZGF0YSBmb3IgdGhyZWUgdGltZSBwb2ludHMsIHRoaXMgaXMgYSByZWxhdGl2ZWx5IHNwYXJzZSBkYXRhIHNldCBmb3IgY29uc3RyYWluaW5nIHRoZXNlIG1vZGVscy4gQWNjb3JkaW5nbHksIHRoZSBvcHRpbWl6YXRpb24gcHJvY2VkdXJlIHdpbGwgYmVuZWZpdCBmcm9tICphIHByaW9yaSogY29uc3RyYWludHMgb2YgdGhlIGFsbG93YWJsZSBwYXJhbWV0ZXIgcmFuZ2VzLiBGb3IgZXhhbXBsZSwgc2luY2Ugd2UgYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSBjYW5ub3QgYmUgYWRlcXVhdGVseSBtb2RlbGVkIGFzIGEgc2luZ2xlIGhvbW9nZW5vdXMgcmVzZXJ2b2lyLCB3ZSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBvcHRpbWl6YXRpb24gcHJvY2VkdXJlIGNhbm5vdCBjb2xsYXBzZSB0aGUgdHdvLXBvb2wgc3lzdGVtIGludG8gYSBzaW5nbGUgcG9vbC4gVGhpcyBjYW4gYmUgbWl0aWdhdGVkIGluIHRoZSB0d28tcG9vbCBwYXJhbGxlbCBvcHRpbWl6YXRpb24gYnkgY29uc3RyYWluaW5nICRcZ2FtbWEkIChpLmUuIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBpbnB1dHMgZW50ZXJpbmcgdGhlIGZhc3QgcG9vbCkgdG8gYSByYW5nZSBvZiA1MCUgdG8gOTUlLiBTaW1pbGFybHksIGZvciB0aGUgdHdvLXBvb2wgc2VyaWVzIG1vZGVsIHN0cnVjdHVyZSB3ZSBjYW4gY29uc3RyYWluIHRoZSByYW5nZSBvZiB0aGUgdHJhbnNmZXIgY29lZmZpY2llbnQgdG8gYmUgYmV0d2VlbiAwLjAgYW5kIDAuMSwgZW5zdXJpbmcgdGhhdCBzb21lIGNhcmJvbiByZW1haW5zIGluIHRoZSBmYXN0IGN5Y2xpbmcgcG9vbC4KCkFkZGl0aW9uYWxseSwgdG8gZW5mb3JjZSBhIHJlbGF0aXZlbHkgZmFzdCBjeWNsaW5nIHBvb2wgYW5kIHJlbGF0aXZlbHkgc2xvd2VyIGN5Y2xpbmcgcG9vbCwgd2Ugd2lsbCBsb29zZWx5IGNvbnN0cmFpbiB0aGUgaW50cmluc2ljIGRlY29tcG9zaXRpb24gcmF0ZXMgYXMgd2VsbCAoYm90aCBtb2RlbCBzdHJ1Y3R1cmVzKToKCiprfjF+KjogWzAuMDIsIDEuMDBdICg1MCB0byAxIHllYXIpCiprfjJ+KjogWzAuMDAwMSwgMC4wMl0gKDEwLDAwMCB0byA1MCB5ZWFycykKCkZpbmFsbHksIHRoZSBtb2RlbHMgd2lsbCBiZSBydW4gdG8gZW5mb3JjZSBzdGVhZHktc3RhdGUsIGkuZS4gd2l0aCB1bnZhcnlpbmcgY2FyYm9uIHN0b2Nrcy4gVGhlIGFtb3VudCBvZiBjYXJib24gb2JzZXJ2ZWQgaW4gdGhlIHN5c3RlbSB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvc3QgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIHJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBtYWRlIGluIDIwMDEsIDIwMDksIGFuZCAyMDE5LiBUaGUgaW5wdXRzIHdpbGwgYmUgZXN0aW1hdGVkIGZyb20gbmV0IGVjb3N5c3RlbSBleGNoYW5nZSAoTkVFKSBkYXRhIG1lYXN1cmVkIGF0IG5lYXJieSBlZGR5IGNvdmFyaWFuY2Ugc2l0ZXM6IEJsb2RnZXR0IGV4cGVyaW1lbnRhbCBmb3Jlc3QgKEFtZXJpRmx1eCksIExvd2VyIFRlYWtldHRsZSAoTkVPTiksIGFuZCBTb2Fwcm9vdCBTYWRkbGUgKE5FT04pLiBBbHRlcm5hdGl2ZWx5LCB1c2luZyBjb3JyZWxhdGlvbnMgYmV0d2VlbiBmbHV4ZXMgbWVhc3VyZWQgZnJvbSB0aGVzZSBlZGR5IGNvdmFyaWFuY2UgdG93ZXJzIGFuZCBHUFAgZXN0aW1hdGVkIGZyb20gc2F0ZWxsaXRlIHJldHJpZXZhbHMgb2YgU0lGLCBlc3RpbWF0ZXMgY2FuIGJlIG1hZGUgZm9yIGlucHV0cyBhdCB0aGUgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBzaXRlIGxvY2F0aW9uLgoKYGBge3Igb3B0LW1vZCwgZXZhbCA9IEZBTFNFfQojIE5vdGU6IHRoaXMgb25seSBydW5zIGlmIGV2YWwgZmxhZyBzd2l0Y2hlZCB0byBUUlVFCiMjIE9wdGltaXplIG1vZGVsIHBhcnMKIyBDb3N0IGZ1bmN0aW9uIChldmFsdWF0ZXMgZXJyb3IgYXMgbW9kZWwgdnMuIG9ic3YsIHBlciBGTUUgcmVxKQojIG5vdGUgdGhhdCB3ZSBoYXZlIHRvIHNldCAicGFzcyIgdG8gVFJVRSBzbyBTb2lsUiBtb2RlbCBkb2Vzbid0IGZhaWwgKG5lZy4gcmVzcCkKbW9kLmZpdHMuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLCBJbiwgc3ViLCBsYWcgPSAwLCB1cHBlciwgbG93ZXIsIGNvc3QpIHsKICAKICAjIHN0YXJ0IGxvb3AKICBsYXBwbHkoc2VxX2Fsb25nKHBhcnNbc3ViXSksIGZ1bmN0aW9uKGkpIHsKICAgIAogICAgIyBzdGFydCB0aW1lciBhbmQgcHJpbnQgUE1lY29fZGVwdGgKICAgIHN0YXJ0IDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAobmFtZXMocGFycylbc3ViXVtpXSwgIiBwYXJhbWV0ZXIgZml0dGluZ1xuIikpCiAgCiAgICAjIGRlZmluZSBwYXJzCiAgICBwYXJzIDwtIHBhcnNbc3ViXVtbaV1dCiAgICBpZiAobW9kID09ICIycHAiKSB7CiAgICAgIG5hbWVzKHBhcnMpIDwtIGMoImsxIiwgImsyIiwgImdhbSIpCiAgICB9IGVsc2UgewogICAgICBuYW1lcyhwYXJzKSA8LSBjKCJrMSIsICJrMiIsICJ0YyIpCiAgICB9CiAgICAKICAgICMgU2V0IGlucHV0CiAgICBJbiA8LSBJbltzdWJdW1tpXV0KICAgIAogICAgIyBkZWZpbmUgY29zdCBmdW5jdGlvbgogICAgaWYgKGNvc3QgPT0gIjE0QyArIGNTdG9jayIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBJbiwgbW9kID0gbW9kLCBsYWcgPSBsYWcpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgY29zdDIgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcC4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUsIGNvc3QgPSBjb3N0MSkgCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmNTdG9ja1tzdWJdW1tpXV0sIGNvc3QgPSBjb3N0MikpCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29zdCA9PSAiMTRDICsgc3RvY2svZmx4IikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuXzJwKHBhcnMsIEluLCBtb2QgPSBtb2QsIGxhZyA9IGxhZykKICAgICAgICBjb3N0MSA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkKICAgICAgICBjb3N0MiA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5yZXNwLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSwgY29zdCA9IGNvc3QxKSAKICAgICAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuZmx4LnN0b2NrW1tpXV0sIGNvc3QgPSBjb3N0MikpCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29zdCA9PSAiMTRDIikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuXzJwKHBhcnMsIEluLCBtb2QgPSBtb2QsIGxhZyA9IGxhZykKICAgICAgICBjb3N0MSA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkKICAgICAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcC4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUsIGNvc3QgPSBjb3N0MSkpCiAgICAgIH0gCiAgICB9IGVsc2UgaWYgKGNvc3QgPT0gIjE0QyBidWxrICsgY1N0b2NrIikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuXzJwKHBhcnMsIEluLCBtb2QgPSBtb2QsIGxhZyA9IGxhZykKICAgICAgICBjb3N0MSA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrLjE0Y1tzdWJdW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkKICAgICAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuY1N0b2NrW3N1Yl1bW2ldXSwgY29zdCA9IGNvc3QxKSkKICAgICAgfQogICAgfSBlbHNlIGlmIChjb3N0ID09ICIxNEMgYnVsayBvbmx5IikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihwYXJzKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuXzJwKHBhcnMsIEluLCBtb2QgPSBtb2QsIGxhZyA9IGxhZykKICAgICAgICByZXR1cm4obW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpKQogICAgICB9CiAgICB9CiAgICAKICAgICMgZml0IHBhcnMKICAgIGZpdCA8LSB0cnlDYXRjaCgKICAgICAgbW9kRml0KGYgPSBtb2QuQ29zdCwKICAgICAgICAgICAgIHAgPSBwYXJzLAogICAgICAgICAgICAgbWV0aG9kID0gJ05lbGRlci1NZWFkJywKICAgICAgICAgICAgIHVwcGVyID0gdXBwZXIsIAogICAgICAgICAgICAgbG93ZXIgPSBsb3dlciksCiAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCiAgICAKICAgIFNmdW4gPC0gc2Vuc0Z1bihtb2QuQ29zdCwgZml0JHBhcikKICAgIAogICAgIyBFbmQgdGltZXIgYW5kIHByaW50IGVsYXBzZWQgdGltZQogICAgZW5kIDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAoInRpbWU6ICIsIGVuZCAtIHN0YXJ0LCAiXG4iKSkKICAgIAogICAgIyBSZXR1cm4gZml0dGVkIHBhcmFtZXRlcnMgYW5kIHNlbnNpdGl2aXR5CiAgICByZXR1cm4obGlzdChtb2RmaXQgPSBmaXQsIHNlbnMgPSBTZnVuKSkKICB9KSAKfQoKIyMgMnBwCiMgcGFyIHJhbmdlIFswLCAxXSBmb3IgYWxsIHBhcnMKbW9kLnNlbnMuZml0cy4ycHAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyBjb25zdHJhaW4gZ2FtbWEgdG8gWzAuNSwgMC45NV0KbW9kLnNlbnMuZml0cy4ycHAucDMuNS45NSA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAwLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwLjUpKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1LCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcC5wMy41Ljk1IiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcC5wMy41Ljk1IDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcC5wMy41Ljk1LCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIDJwcDMgKHBhciByYW5nZSBjb25zdHJhaW50cywgaW5wdXRzIGZpdCB0byBtZWFzIHN0b2NrcykKbW9kLnNlbnMuZml0cy4ycHAzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4ubWVhcy4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBvbmx5IikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHAzKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDMsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwMyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAycHAzcyAocGFyIHJhbmdlIGNvbnN0cmFpbnRzLCBpbnB1dHMgZml0IHRvIG1lYXMgc3RvY2tzLCArIHN0b2NrIGNvbnN0cmFpbnQpCm1vZC5zZW5zLmZpdHMuMnBwM3MgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5tZWFzLjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHAzcykgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHAzcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHAzcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHAzcyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAzcywgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMnBzCiMgcGFyIHJhbmdlIFswLCAxXSBmb3IgYWxsIHBhcnMKbW9kLnNlbnMuZml0cy4ycHMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIHBhciByYW5nZSBbMCwgMV0gZm9yIGFsbCBwYXJzLCBzdG9ja3MgKyAxNEMsIHcvIGVzdGltYXRlZCBpbnB1dHMKIyAxMAptb2Quc2Vucy5maXRzLjJwczUuMTAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczUuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzNS4xMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2Quc2Vucy5maXRzLjJwczUuMTAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzNS4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM1LjEwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAKbW9kLnNlbnMuZml0cy4ycHM1LjIwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHM1LjIwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwczUuMjAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4ycHM1LjIwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczUuMjAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNS4yMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyAyMC0zMAptb2Quc2Vucy5maXRzLjJwcy4zMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYygwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHMuMzAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcy4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMzAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMgMnBzMyAocGFyIHJhbmdlIGNvbnN0cmFpbnRzLCBpbnB1dHMgZml0IHRvIG1lYXMgc3RvY2tzKQptb2Quc2Vucy5maXRzLjJwczMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5tZWFzLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAxLCAuMTUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIC4wMDA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIG9ubHkiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwczMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzMywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMzIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwczMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzMywgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDJwczMgKHBhciByYW5nZSBjb25zdHJhaW50cywgaW5wdXRzIGZpdCB0byBtZWFzIHN0b2NrcywgKyBzdG9jayBjb25zdHJhaW50KQptb2Quc2Vucy5maXRzLjJwczNzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4ubWVhcy4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gImNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzM3MpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzM3MsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzM3MiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzM3MgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzM3MsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMjIyAycDQgKHBhciByYW5nZSBzZXQsIHN0b2NrIGFuZCBidWxrIDE0QyBjb3N0cywgR1BQLWJhc2VkIGlucHV0cyBieSBlY28pCiMjIDJwcAojIDAtMTAKbW9kLnNlbnMuZml0cy4ycHA0LjEwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwNC4xMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHA0LjEwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcDQuMTAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwNC4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0LjEwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAtMzAKbW9kLnNlbnMuZml0cy4ycHA0LjMwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjA0LCAuMDAwMSwgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwNC4zMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMzBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHA0LjMwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcDQuMzAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwNC4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0LjMwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMjIDJwcwojIDAtMTAKbW9kLnNlbnMuZml0cy4ycHM0LjEwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzNC4xMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHM0LjEwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczQuMTAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzNC4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0LjEwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgMjAtMzAKbW9kLnNlbnMuZml0cy4ycHM0LjMwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgYnVsayArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzNC4zMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHM0LjMwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwczQuMzAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzNC4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0LjMwLCBmdW5jdGlvbih4KSB4W1sxXV0pCgojIyMgMnA0ciAocGFyIHJhbmdlIHNldCwgc3RvY2ssIGJ1bGssIGFuZCByZXNwaXJhdGlvbiAxNEMgY29zdHMsIEdQUC1iYXNlZCBpbnB1dHMgYnkgZWNvKQojIyAycHAKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBwNHIuMTAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk1MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBwNHIuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBwNHIuMTAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBwNHIuMTAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBwNHIuMTAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNHIuMTAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyAyMC0zMAptb2Quc2Vucy5maXRzLjJwcDRyLjMwIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC45NTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcDRyLjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4zMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcDRyLjMwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcDRyLjMwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcDRyLjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDRyLjMwLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMjIDJwcwojIDAtMTAKbW9kLnNlbnMuZml0cy4ycHM0ci4xMCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wNCwgLjAwMDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHM0ci4xMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLnNlbnMuZml0cy4ycHM0ci4xMCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHM0ci4xMCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQptb2QuZml0cy4ycHM0ci4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0ci4xMCwgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDIwLTMwCm1vZC5zZW5zLmZpdHMuMnBzNHIuMzAgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDQsIC4wMDAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzNHIuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzNHIuMzAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzNHIuMzAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzNHIuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzNHIuMzAsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKYGBgCgpgYGB7ciByZXBvcnQtcGFyLWZpdH0KIyBsb2FkIGluaXRpYWwgcGFyYW1ldGVycyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoInBhcnMuaS4ycHAiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHBfMjAyMC0xMS0xNi5SZGF0YSIpIAp9CmlmICghZXhpc3RzKCJwYXJzLmkuMnBzIikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwc18yMDIwLTExLTE2LlJkYXRhIikgIAp9CgojIGxvYWQgZml0cyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcCIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcF8yMDIwLTExLTE2LlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwLnAzLjUuOTUiKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHAucDMuNS45NV8yMDIwLTExLTE2LlJkYXRhIikgIAp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHMiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHNfMjAyMC0xMS0xNi5SZGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcDIiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHAuZmx4LnN0b2NrXzIwMjAtMTItMDIuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHMyIikpIHsKIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLmZseC5zdG9ja18yMDIwLTEyLTAyLlJkYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwMyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcDNfMjAyMC0xMi0wOC5SRGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwczMiKSkgewogbG9hZChmaWxlID0gIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMzXzIwMjAtMTItMDguUmRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHAzcyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcDNzXzIwMjAtMTItMDguUkRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2QuZml0cy4ycHMzcyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwczNzXzIwMjAtMTItMDguUmRhdGEiKQp9CgojIyBQYXIgZXN0aW1hdGVzCiMgMnBwCnBhcnMuZml0LjJwcCA8LSBsYXBwbHkobW9kLmZpdHMuMnBwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQojIDJwcCBnYW0gPSBbLjUsIC45NV0KcGFycy5maXQuMnBwLnAzLjUuOTUgPC0gbGFwcGx5KG1vZC5maXRzLjJwcC5wMy41Ljk1LCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCgojIDJwcwpwYXJzLmZpdC4ycHMgPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KCgojIDJwcDIgKGlucHV0L3N0b2NrIGFuZCAxNEMgY29uc3RyYWludHMpCnBhcnMuZml0LjJwcDIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDIpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQojIDJwczIgKGlucHV0L3N0b2NrIGFuZCAxNEMgY29uc3RyYWludHMpCnBhcnMuZml0LjJwczIgPC0gbGFwcGx5KG1vZC5maXRzLjJwczIsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQoKIyAycHAzICgxNEMgY29uc3RyYWludHMsIGNvbnN0cmFpbmVkIHBhciByYW5nZXMsIHN0b2NrLWZpdCBpbnB1dHMpCnBhcnMuZml0LjJwcDMgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcDMpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQojIDJwczMgKDE0QyBjb25zdHJhaW50cywgY29uc3RyYWluZWQgcGFyIHJhbmdlcywgc3RvY2stZml0IGlucHV0cykKcGFycy5maXQuMnBzMyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzMywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzMykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCgojIDJwcDNzICgxNEMgY29uc3RyYWludHMsIGNvbnN0cmFpbmVkIHBhciByYW5nZXMsIHN0b2NrLWZpdCBpbnB1dHMsICsgc3RvY2sgY29uc3RyYWludCkKcGFycy5maXQuMnBwM3MgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDNzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHAzcykgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCiMgMnBzM3MgKDE0QyBjb25zdHJhaW50cywgY29uc3RyYWluZWQgcGFyIHJhbmdlcywgc3RvY2stZml0IGlucHV0cywgKyBzdG9jayBjb25zdHJhaW50KQpwYXJzLmZpdC4ycHMzcyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzM3MsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczNzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KCiMjIHN0b2NrICYgYnVsayAxNEMgY29zdHMgb25seQojIDJwcApwYXJzLmZpdC4ycHA0LjEwIDwtIGxhcHBseShtb2QuZml0cy4ycHA0LjEwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHA0LjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KcGFycy5maXQuMnBwNC4zMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBwNC4zMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwNC4zMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMzBdCiMgMnBzCnBhcnMuZml0LjJwczQuMTAgPC0gbGFwcGx5KG1vZC5maXRzLjJwczQuMTAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczQuMTApIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpwYXJzLmZpdC4ycHM0LjMwIDwtIGxhcHBseShtb2QuZml0cy4ycHM0LjMwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHM0LjMwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KCiMjIHN0b2NrLCBidWxrIGFuZCByZXNwaXJhdGlvbiAxNEMgY29zdHMKIyAycHAKcGFycy5maXQuMnBwNHIuMTAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcDRyLjEwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHA0ci4xMCkgPC0gbmFtZXMocGFycy5pLjJwcClbaXguMTBdCnBhcnMuZml0LjJwcDRyLjMwIDwtIGxhcHBseShtb2QuZml0cy4ycHA0ci4zMCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwNHIuMzApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjMwXQojIDJwcwpwYXJzLmZpdC4ycHM0ci4xMCA8LSBsYXBwbHkobW9kLmZpdHMuMnBzNHIuMTAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwczRyLjEwKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KcGFycy5maXQuMnBzNHIuMzAgPC0gbGFwcGx5KG1vZC5maXRzLjJwczRyLjMwLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4ycHM0ci4zMCkgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCgojIyBTdW1tYXJ5IG9mIGZpdHMKIyAycHAKcGFycy5maXQuMnBwLnN1bSA8LSBsYXBwbHkobW9kLmZpdHMuMnBwLCBmdW5jdGlvbih4KSB7CiAgdHJ5Q2F0Y2goc3VtbWFyeSh4KSwgCiAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMocGFycy5maXQuMnBwLnN1bSkgPC0gbmFtZXMocGFycy5maXQuMnBwKQojIDJwcwpwYXJzLmZpdC4ycHMuc3VtIDwtIGxhcHBseShtb2QuZml0cy4ycHMsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLCAKICAgICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhwYXJzLmZpdC4ycHMuc3VtKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpCgojIyBTdW1tYXJ5IG9mIGVycm9ycwojIGJlc3QgcGFyIHNldCAoc3NyKQpzc3IuMnBwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwcy5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHAyLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHAyLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHMyLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHMyLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCiMgc3RvY2sgYW5kIGJ1bGsgMTRDIGNvc3RzIG9ubHkKc3NyLjJwcDQuMTAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcDQuMTAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwcDQuMzAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcDQuMzAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwczQuMTAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwczQuMTAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwczQuMzAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwczQuMzAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKIyBzdG9jaywgYnVsayBhbmQgcmVzcCAxNEMgY29zdHMKc3NyLjJwcDRyLjEwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHA0ci4xMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBwNHIuMzAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcDRyLjMwLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpCnNzci4ycHM0ci4xMC5kZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMuMnBzNHIuMTAsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKc3NyLjJwczRyLjMwLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHM0ci4zMCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQoKIyBtZWFuIHJlc2lkdWFscywgYnkgdmFyICh2YXJfbXMpCnZhcl9tcy5kZi5meCA8LSBmdW5jdGlvbihtb2QuZml0cy5scywgY29zdHMpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGJpbmRfcm93cyhsYXBwbHkobW9kLmZpdHMubHMsICJbIiwgInZhcl9tcyIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKICBpZiAobGVuZ3RoKGNvc3RzKSA9PSAyICkgewogICAgZGYkdmFyIDwtIHJlcChjKCJyZXNwIiwgImJ1bGtDIiksIG5yb3coZGYpLzIpCiAgfSBlbHNlIHsKICAgIGRmJHZhciA8LSByZXAoYygicmVzcCIsICJidWxrQyIsICJmbHguc3RvY2siKSwgbnJvdyhkZikvMykKICB9CiAgZGYkdmFyX21zIDwtIHJvdW5kKGRmJHZhcl9tcywgNSkKICByZXR1cm4oZGYpCn0KdmFyX21zLjJwcC5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBwLCBjKCJyZXNwIiwgImJ1bGtDIikpCnZhcl9tcy4ycHAucDMuNS45NS5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBwLnAzLjUuOTUsIGMoInJlc3AiLCAiYnVsa0MiKSkKdmFyX21zLjJwcy5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBzLCBjKCJyZXNwIiwgImJ1bGtDIikpCnZhcl9tcy4ycHAyLmRmIDwtIHZhcl9tcy5kZi5meChtb2QuZml0cy4ycHAyLCBjKCJyZXNwIiwgImJ1bGtDIiwgImZseC5zdG9jayIpKQp2YXJfbXMuMnBzMi5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBzMiwgYygicmVzcCIsICJidWxrQyIsICJmbHguc3RvY2siKSkKCiMgYmluZCBmaXR0ZWQgcGFycyB3aXRoIGluaXRpYWwgcGFycyBpbnRvIGRhdGEgZnJhbWUgZm9yIHBsb3R0aW5nL3N1bW1hcml6aW5nCnBhci5maXQuZGYuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLmZpdCwgcGFycy5pKSB7CiAgZGYgPC0gYmluZF9yb3dzKAogICAgbGFwcGx5KAogICAgICBtYXBwbHkocmJpbmQsIAogICAgICAgICAgICAgcGFycy5maXQsCiAgICAgICAgICAgICBwYXJzLmksCiAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSwgCiAgICAgIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShkZikKICAgICAgICBpZiAobW9kID09ICIycHAiKSB7CiAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygia2Zhc3QiLCAia3Nsb3ciLCAiZ2FtIikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29sbmFtZXMoZGYpIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImEyMSIpCiAgICAgICAgfQogICAgICAgIGRmJGVzdCA8LSBjKCJmaXQiLCAiaW5pdCIpCiAgICAgICAgcmV0dXJuKGRmKQogICAgICB9KQogICkKICBkZiRQTWVjb19kZXB0aCA8LSByZXAobmFtZXMocGFycy5pKSwgZWFjaCA9IDIpCiAgZGYkUE0gPC0gc3Vic3RyKGRmJFBNZWNvX2RlcHRoLCBzdGFydCA9IDEsIHN0b3AgPSAyKQogIGRmJGVjbyA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMywgc3RvcCA9IDQpCiAgZGYkZGVwdGggPC0gc3Vic3RyKGRmJFBNZWNvX2RlcHRoLCBzdGFydCA9IDYsIHN0b3AgPSBsZW5ndGgoZGYkUE1lY29fZGVwdGgpKQogIHJldHVybihkZikKfQoKCiMjIDJwcAojIGdhbSByYW5nZSA9IFswLCAxXQpwYXJzLmZpdC4ycHAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQojIGdhbSByYW5nZSA9IFsuNSwgLjk1XQpwYXJzLmZpdC4ycHAucDMuNS45NS5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwLnAzLjUuOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCiMgdy8gaW5wdXQvc3RvY2sgY29zdCBhbmQgZ2FtIHJhbmdlID0gWy41LCAuOTVdCnBhcnMuZml0LjJwcDIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQoKIyMgMnBzCiMgYTIxIHJhbmdlID0gWzAsIDFdCnBhcnMuZml0LjJwcy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgdy8gaW5wdXQvc3RvY2sgY29zdCBhbmQgYTIxIHJhbmdlID0gWzAsIDFdCnBhcnMuZml0LjJwczIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKCiMjIENvbnN0cmFpbmVkIHBhciByYW5nZXMsIHdpdGggYW5kIHdpdGhvdXQgc3RvY2sgY29uc3RyYWludAojIHcvbyBzdG9jawpwYXJzLmZpdC4ycHAzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKcGFycy5maXQuMnBzMy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgdy8gc3RvY2sKcGFycy5maXQuMnBwM3MuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQpwYXJzLmZpdC4ycHMzcy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzM3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgdy8gc3RvY2sgJiBidWxrIDE0QyBvbmx5CnBhcnMuZml0LjJwcDQuMTAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBwNC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHBbaXguMTBdKQpwYXJzLmZpdC4ycHA0LjMwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDQuMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjMwXSkKcGFycy5maXQuMnBzNC4xMC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHM0LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCnBhcnMuZml0LjJwczQuMzAuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzNC4zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMzBdKQoKIyB3LyBzdG9jaywgYnVsayArIHJlc3AgMTRDCnBhcnMuZml0LjJwcDRyLjEwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDRyLjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCnBhcnMuZml0LjJwcDRyLjMwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcDRyLjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4zMF0pCnBhcnMuZml0LjJwczRyLjEwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczRyLjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCnBhcnMuZml0LjJwczRyLjMwLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwczRyLjMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgoKIyMgU3VtbWFyaXplIGJ5IFBNLCBkZXB0aAojIDJwcAojIFBNL2RlcHRoCnBhcnMuZml0LjJwcC5kZi5QTSA8LSBwYXJzLmZpdC4ycHAuZGYgJT4lCiAgICBmaWx0ZXIoZXN0ID09ICJmaXQiKSAlPiUKICAgIHNlbGVjdCghYyhlc3QsIFBNZWNvX2RlcHRoLCBlY28pKSAlPiUKICAgIGdyb3VwX2J5KFBNLCBkZXB0aCkgJT4lCiAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDIpCiMgcHJpbnQgdGFibGUKa25pdHI6OmthYmxlKHBhcnMuZml0LjJwcC5kZi5QTSwKICAgICAgICAgICAgIGNhcHRpb24gPSAiTWVhbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGJ5IHBhcmVudCBtYXRlcmlhbCAoUE0pIiwKICAgICAgICAgICAgIGFsaWduID0gImMiKQojIGVjby9kZXB0aApwYXJzLmZpdC4ycHAuZGYuZWNvIDwtIHBhcnMuZml0LjJwcC5kZiAlPiUKICBmaWx0ZXIoZXN0ID09ICJmaXQiKSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIHNlbGVjdCghYyhlc3QsIFBNZWNvX2RlcHRoLCBQTSkpICU+JQogIGdyb3VwX2J5KGVjbywgZGVwdGgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDIpCiMgcHJpbnQgdGFibGUKa25pdHI6OmthYmxlKHBhcnMuZml0LjJwcC5kZi5lY28sCiAgICAgICAgICAgICBjYXB0aW9uID0gIk1lYW4gcGFyYW1ldGVyIGVzdGltYXRlcyBieSBlY29zeXN0ZW0gKGVjbykiLAogICAgICAgICAgICAgYWxpZ24gPSAiYyIpCmBgYAoKYGBge3Igc2Vucy1mdW4tZml0c30KIyMgbG9vayBhdCBzZW5zRnVuIG91dHB1dAojIHdpdGhvdXQgY29uc3RyYWludHMKc2Vucy4ycHAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcywgZnVuY3Rpb24oeCkgeFtbMl1dKQojIHdpdGhvdXQgc3RvY2sgY29uc3RyYWludApzZW5zLjJwcDMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwMywgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzMywgZnVuY3Rpb24oeCkgeFtbMl1dKQojIHdpdGggc3RvY2sgY29uc3RyYWludApzZW5zLjJwcDNzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDNzLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzM3MgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzM3MsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQsIHcvbyByZXNwCnNlbnMuMnBwNC4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0LjEwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBwNC4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHA0LjMwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzNC4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0LjEwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzNC4zMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0LjMwLCBmdW5jdGlvbih4KSB4W1syXV0pCiMgd2l0aCBzdG9jayBjb25zdHJhaW50ICsgcmVzcApzZW5zLjJwcDRyLjEwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcDRyLjEwLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBwNHIuMzAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwNHIuMzAsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHM0ci4xMCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHM0ci4xMCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwczRyLjMwIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwczRyLjMwLCBmdW5jdGlvbih4KSB4W1syXV0pCgoKIyBwbG90IHNlbnNpdGl2aXR5CiMgdy9vIGNvbnN0cmFpbnRzCmxhcHBseShzZW5zLjJwcCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgInJlc3AiKSkpCmxhcHBseShzZW5zLjJwcywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgInJlc3AiKSkpCiMgdy9vIHN0b2NrIGNvbnN0cmFpbnQKbGFwcGx5KHNlbnMuMnBwMywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzMywgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBwM3MsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczNzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQojIHdpdGggc3RvY2sgY29uc3RyYWludCwgdy9vIHJlc3AKbGFwcGx5KHNlbnMuMnBwNC4xMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBwNC4zMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzNC4xMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzNC4zMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKIyB3aXRoIHN0b2NrIGNvbnN0cmFpbnQgKyByZXNwCmxhcHBseShzZW5zLjJwcDRyLjEwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQpsYXBwbHkoc2Vucy4ycHA0ci4zMCwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgImNTdG9jayIpKSkKbGFwcGx5KHNlbnMuMnBzNHIuMTAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJjU3RvY2siKSkpCmxhcHBseShzZW5zLjJwczRyLjMwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAiY1N0b2NrIikpKQoKCiMgbG9vayBhdCBpZGVudGlmaWFiaWxpdHkKaW5kZW4uZGYuZnggPC0gZnVuY3Rpb24obHMsIG1vZCkgewogIGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgZGYgPC0gY29sbGluKHgpCiAgICBpZiAobW9kID09ICIycHAiKSB7CiAgICAgIGRmJFBhckNvbWJvIDwtIGZhY3RvcihjKCJrMSArIGsyIiwgImsxICsgZ2FtIiwgImsyICsgZ2FtIiwgImsxICsgazIgKyBnYW0iKSkKICAgIH0gZWxzZSB7CiAgICAgIGRmJFBhckNvbWJvIDwtIGZhY3RvcihjKCJrMSArIGsyIiwgImsxICsgYTIxIiwgImsyICsgYTIxIiwgImsxICsgazIgKyBhMjEiKSkKICAgIH0KICAgIHJldHVybihkZikKICB9KQp9CgppZGVuLjJwcCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcCwgbW9kID0gIjJwcCIpCmlkZW4uMnBzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLCBtb2QgPSAiMnBzIikKaWRlbi4ycHAzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwMywgbW9kID0gIjJwcCIpCmlkZW4uMnBzMyA8LSBpbmRlbi5kZi5meChzZW5zLjJwczMsIG1vZCA9ICIycHMiKQppZGVuLjJwcDNzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwM3MsIG1vZCA9ICIycHAiKQppZGVuLjJwczNzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzM3MsIG1vZCA9ICIycHMiKQojIHdpdGggc3RvY2sgY29uc3RyYWludCwgdy9vIHJlc3AKaWRlbi4ycHA0LjEwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwNC4xMCwgbW9kID0gIjJwcCIpCmlkZW4uMnBwNC4zMCA8LSBpbmRlbi5kZi5meChzZW5zLjJwcDQuMzAsIG1vZCA9ICIycHAiKQppZGVuLjJwczQuMTAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHM0LjEwLCBtb2QgPSAiMnBzIikKaWRlbi4ycHM0LjMwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzNC4zMCwgbW9kID0gIjJwcyIpCiMgd2l0aCBzdG9jayBjb25zdHJhaW50ICsgcmVzcAppZGVuLjJwcDRyLjEwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwNHIuMTAsIG1vZCA9ICIycHAiKQppZGVuLjJwcDRyLjMwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBwNHIuMzAsIG1vZCA9ICIycHAiKQppZGVuLjJwczRyLjEwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzNHIuMTAsIG1vZCA9ICIycHMiKQppZGVuLjJwczRyLjMwIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzNHIuMzAsIG1vZCA9ICIycHMiKQoKIyBpZGVudGlmaWFiaWxpdHkgcGxvdCBmdW5jdGlvbgpjb2xsLnBsb3QuZnggPC0gZnVuY3Rpb24oZGYsIG1vZCwgUE1lY29fZGVwdGgsIGNvbC5tYXgpIHsKICBnZ3Bsb3QoZGYsIGFlcyhOLCBsb2coY29sbGluZWFyaXR5KSwgY29sb3IgPSBQYXJDb21ibykpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGxvZygyMCkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMuNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC4xKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbG9nKGNvbC5tYXgpKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS41LCAzLjUpLCBicmVha3MgPSBjKDIsIDMpKSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUoUE1lY29fZGVwdGgsIG1vZCkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgaWYgKG1vZCA9PSAiMnBwIiB8IG1vZCA9PSAiMnBwICsgc3RvY2siKSB7CiAgICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgbmFtZSA9ICJQYXJhbWV0ZXIgY29tYmluYXRpb24iLAogICAgICAgdmFsdWVzID0gYygiazEgKyBrMiIgPSAiI0VGNDc2RiIsCiAgICAgICAgICAgICAgICAgICJrMSArIGdhbSIgPSAiI0ZGRDE2NiIsCiAgICAgICAgICAgICAgICAgICJrMiArIGdhbSIgPSAiIzExOEFCMiIsCiAgICAgICAgICAgICAgICAgICJrMSArIGsyICsgZ2FtIiA9ICIwNzNCNEMiKSkgCiAgICB9IGVsc2UgewogICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgbmFtZSA9ICJQYXJhbWV0ZXIgY29tYmluYXRpb24iLAogICAgICAgIHZhbHVlcyA9IGMoImsxICsgazIiID0gIiNFRjQ3NkYiLAogICAgICAgICAgICAgICAgICAiazEgKyBhMjEiID0gIiNGRkQxNjYiLAogICAgICAgICAgICAgICAgICAiazIgKyBhMjEiID0gIiMxMThBQjIiLAogICAgICAgICAgICAgICAgICAiazEgKyBrMiArIGEyMSIgPSAiMDczQjRDIikpCiAgICB9Cn0KbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHBbW2ldXSwgbW9kID0gIjJwcCIsIG5hbWVzKGlkZW4uMnBwKVtpXSwgbWF4KGlkZW4uMnBwW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHNbW2ldXSwgbW9kID0gIjJwcyIsIG5hbWVzKGlkZW4uMnBzKVtpXSwgbWF4KGlkZW4uMnBzW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwM1tbaV1dLCBtb2QgPSAiMnBwIiwgbmFtZXMoaWRlbi4ycHAzKVtpXSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDNzKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDNzW1tpXV0sIG1vZCA9ICIycHAgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBwM3MpW2ldKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzMyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHMzW1tpXV0sIG1vZCA9ICIycHMiLCBuYW1lcyhpZGVuLjJwczMpW2ldKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzM3MpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzM3NbW2ldXSwgbW9kID0gIjJwcyArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHMzcylbaV0pCn0pCiMgc3RvY2sgY29uc3RyYWludCwgdy9vIHJlc3AKY29sLm1heCA8LSBtYXgodW5saXN0KGxpc3QobGFwcGx5KGlkZW4uMnBzNC4xMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBzNC4zMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBwNC4xMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBwNC4zMCwgZnVuY3Rpb24oZGYpIGRmW1siY29sbGluZWFyaXR5Il1dKSkpKQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHM0LjEwW1tpXV0sIG1vZCA9ICIycHMgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBzNC4xMClbaV0sIGNvbC5tYXgpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHM0LjMwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczQuMzBbW2ldXSwgbW9kID0gIjJwcyArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHM0LjMwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDQuMTApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBwNC4xMFtbaV1dLCBtb2QgPSAiMnBwICsgc3RvY2siLCBuYW1lcyhpZGVuLjJwcDQuMTApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHA0LjMwW1tpXV0sIG1vZCA9ICIycHAgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBwNC4zMClbaV0sIGNvbC5tYXgpCn0pCgojIHN0b2NrIGNvbnN0cmFpbnQgKyByZXNwCmNvbC5tYXguciA8LSBtYXgodW5saXN0KGxpc3QobGFwcGx5KGlkZW4uMnBzNHIuMTAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBzNHIuMzAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBwNHIuMTAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KGlkZW4uMnBwNHIuMzAsIGZ1bmN0aW9uKGRmKSBkZltbImNvbGxpbmVhcml0eSJdXSkpKSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDRyLjEwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDRyLjEwW1tpXV0sIG1vZCA9ICIycHAiLCBuYW1lcyhpZGVuLjJwcDRyLjEwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcDRyLjMwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcDRyLjMwW1tpXV0sIG1vZCA9ICIycHMiLCBuYW1lcyhpZGVuLjJwcDRyLjMwKVtpXSwgY29sLm1heCkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwczRyLjEwKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwczRyLjEwW1tpXV0sIG1vZCA9ICIycHMgKyBzdG9jayIsIG5hbWVzKGlkZW4uMnBzNHIuMTApW2ldLCBjb2wubWF4KQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzNHIuMzBbW2ldXSwgbW9kID0gIjJwcyArIHN0b2NrIiwgbmFtZXMoaWRlbi4ycHM0ci4zMClbaV0sIGNvbC5tYXgpCn0pCmBgYAoKCmBgYHtyIHBsb3QtbW9kRml0LXBhcnN9CiMjIHBsb3QgcGFycwpwYXIucGxvdC5meCA8LSBmdW5jdGlvbihtb2QsIGRlcHRoLCBwYXIuZGYsIGluaXRpYWwgPSBGQUxTRSkgewogIHBhci5kZiAlPiUKICAgIHsgaWYgKGluaXRpYWwgPT0gVFJVRSkgLiBlbHNlIGZpbHRlciguLCBlc3QgPT0gImZpdCIpIH0gJT4lCiAgICBmaWx0ZXIoZGVwdGggPT0gZGVwdGgpICU+JQogICAgcGl2b3RfbG9uZ2VyKCEoZXN0OmRlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICAgIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgICAjIGdlb21faml0dGVyKHNpemUgPSA0KSArCiAgICBnZW9tX3BvaW50KHNpemUgPSA0LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIGdndGl0bGUocGFzdGUwKCJtb2RGaXQgcGFycyAiLCBtb2QsICIgIiwgZGVwdGgpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KIyAwLTEwCiMgMnBwCnBhci5wbG90LmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBwLCBnYW0gPSBbLjUsLjk1XQpwYXIucGxvdC5meChtb2QgPSAiMnBwIChnYW0gPSBbMC41LCAwLjk1XSkiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwLnAzLjUuOTUuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyAycHAyCnBhci5wbG90LmZ4KG1vZCA9ICIycHAyIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDIuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyAycHMKcGFyLnBsb3QuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyAycHMyCnBhci5wbG90LmZ4KG1vZCA9ICIycHMyIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczIuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKCiMgdy8gYW5kIHcvbyBzdG9jayBjb25zdHJhaW50CnBhci5wbG90LmZ4KG1vZCA9ICIycHAzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDMuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwcDNzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDNzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHMzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczMuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczNzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczNzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCgojIyBmbHV4IGVzdCBpbnB1dHMgYnkgZWNvCiMgc3RvY2sgYW5kIGJ1bGsgMTRDIG9ubHkKcGFyLnBsb3QuZngobW9kID0gIjJwcDQiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwNC4xMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBwNCIsCiAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwNC4zMC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzNCIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHM0LjEwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHM0IiwKICAgICAgICAgICAgZGVwdGggPSAiMjAtMzAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHM0LjMwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCgojIHN0b2NrIGFuZCBidWxrICsgcmVzcCAxNEMKcGFyLnBsb3QuZngobW9kID0gIjJwcDRyIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcDRyLjEwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHA0ciIsCiAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwNHIuMzAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKcGFyLnBsb3QuZngobW9kID0gIjJwczRyIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwczRyLjEwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHM0ciIsCiAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzNHIuMzAuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKYGBgCgpgYGB7ciBmaXQtc29jLWlufQojIyBGaW5kIGJlc3QgaW5wdXRzCiMgMnBwCmluLmZpdC4ycHAgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5maXQuMnBwKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBwIiwgcGFycy5maXQuMnBwW1tpXV0sIGluLmlbaXguMTBdW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLmZpdC4ycHApIDwtIG5hbWVzKG1vZC5maXRzLjJwcCkKIyAycHAgZ2FtID0gWy41LCAuOTVdCmluLmZpdC4ycHAucDMuNS45NSA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBwIiwgcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhtb2QuZml0cy4ycHAucDMuNS45NSkKIyAycHAyCmluLmZpdC4ycHAyIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwMiksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHAyKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBwIiwgcGFycy5maXQuMnBwMltbaV1dLCBpbi5mbHguc3RvY2tbW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwcDIpIDwtIG5hbWVzKG1vZC5maXRzLjJwcDIpCiMgMnBzCmluLmZpdC4ycHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5maXQuMnBzKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBzIiwgcGFycy5maXQuMnBzW1tpXV0sIGluLmlbaXguMTBdW1tpXV0sIFNPQykpCn0pCm5hbWVzKGluLmZpdC4ycHMpIDwtIG5hbWVzKG1vZC5maXRzLjJwcykKIyAycHMyCmluLmZpdC4ycHMyIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzMiksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHMyKVtpXQogIFNPQyA8LSBjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwibHlyX3NvYyJdCiAgcmV0dXJuKGluLmZpdC5meCgiMnBzIiwgcGFycy5maXQuMnBzMltbaV1dLCBpbi5mbHguc3RvY2tbW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwczIpIDwtIG5hbWVzKG1vZC5maXRzLjJwczIpCgojIyBDYWxjIG1vZGVsZWQgc3RvY2tzIGFuZCBjb21wYXJlIHdpdGggbWVhc3VyZWQgc3RvY2tzCiMgMnBwCm1vZC5zb2NzLjJwcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcFtbaV1dLCBpbi5maXQuMnBwW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwKQpzb2NzLjJwcC5scyA8LSBtYXBwbHkoY2JpbmQsCiAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2Quc29jcy4ycHAubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQptb2Quc29jcy4ycHAucDMuNS45NS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXSwgaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcC5wMy41Ljk1LmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkKc29jcy4ycHAucDMuNS45NWxzIDwtIG1hcHBseShjYmluZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBwLnAzLjUuOTUubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQojIDJwcDIKbW9kLnNvY3MuMnBwMi5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDIpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHAyW1tpXV0sIGluLmZpdC4ycHAyW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcDIubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDIpCgojIDJwcwptb2Quc29jcy4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHNbW2ldXSwgaW4uZml0LjJwc1tbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKc29jcy4ycHMubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgY3NvYy4xOS4wXzMwW2l4LjEwXSwgCiAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBzLmxzLCBjb2xTdW1zKSwgCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQojIDJwczIKbW9kLnNvY3MuMnBzMi5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczIpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMyW1tpXV0sIGluLmZpdC4ycHMyW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwczIubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczIpCgojIyBzdG9jayBhbmQgYnVsayAxNEMgY29zdHMgb25seQojIDJwcAptb2Quc29jcy4ycHA0LjEwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcDQuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHA0LjEwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0LjEwKQptb2Quc29jcy4ycHA0LjMwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcCIsIHBhcnMuZml0LjJwcDQuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHA0LjMwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0LjMwKQojIDJwcwptb2Quc29jcy4ycHM0LjEwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNC4xMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwczQuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHM0LjEwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0LjEwKQptb2Quc29jcy4ycHM0LjMwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNC4zMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwczQuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHM0LjMwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0LjMwKQoKIyMgc3RvY2sgYW5kIGJ1bGsgKyByZXNwIDE0QyBjb3N0cwojIDJwcAptb2Quc29jcy4ycHA0ci4xMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDRyLjEwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBwIiwgcGFycy5maXQuMnBwNHIuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHA0ci4xMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwNHIuMTApCm1vZC5zb2NzLjJwcDRyLjMwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwNHIuMzApLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHAiLCBwYXJzLmZpdC4ycHA0ci4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcDRyLjMwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0ci4zMCkKIyAycHMKbW9kLnNvY3MuMnBzNHIuMTAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBzb2MuZngoIjJwcyIsIHBhcnMuZml0LjJwczRyLjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzNHIuMTAubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczRyLjEwKQptb2Quc29jcy4ycHM0ci4zMC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczRyLjMwKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzNHIuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHM0ci4zMC5scykgPC0gbmFtZXMocGFycy5maXQuMnBzNHIuMzApCgoKIyMgUmV0dXJuIGRhdGEgZnJhbWVzIG9mIG1vZGVsIGZpdHMgd2l0aCBhZGp1c3RlZCBpbnB1dHMgYW5kIG9wdGltYWwgcGFyYW1ldGVycwojIDJwcApUd29wcC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHBbW2ldXSwgaW4uZml0LjJwcFtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiKQp9KQpuYW1lcyhUd29wcC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpUd29wcC5wMy41Ljk1LmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXSwgaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIpCn0pCm5hbWVzKFR3b3BwLnAzLjUuOTUuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpCiMgMnBwMgpUd29wcDIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDIpLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcDJbW2ldXSwgaW4uZml0LjJwcDJbW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBwIikKfSkKbmFtZXMoVHdvcHAyLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcDIpCiMgMnBzClR3b3BzLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwc1tbaV1dLCBpbi5maXQuMnBzW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIpCn0pCm5hbWVzKFR3b3BzLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKIyAycHMyClR3b3BzMi5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzMiksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzMltbaV1dLCBpbi5maXQuMnBzMltbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gVFJVRSkKfSkKbmFtZXMoVHdvcHMyLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczIpCgojIyBzdG9jayBhbmQgYnVsayAxNEMgY29zdHMgb25seQojIDJwcApUd29wcDQuMTAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDQuMTApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcDQuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BwNC4xMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0LjEwKQpUd29wcDQuMzAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDQuMzApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwcDQuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BwNC4zMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0LjMwKQojIDJwcwpUd29wczQuMTAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczQuMTApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwczQuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BzNC4xMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0LjEwKQpUd29wczQuMzAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwczQuMzApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwczQuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BzNC4zMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHM0LjMwKQoKIyMgc3RvY2sgYW5kIGJ1bGsgKyByZXNwIDE0QyBjb3N0cwojIDJwcApUd29wcDRyLjEwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHA0ci4xMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwNHIuMTBbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BwNHIuMTAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwNHIuMTApClR3b3BwNHIuMzAuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcDRyLjMwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHA0ci4zMFtbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIsIHBhc3MgPSBGQUxTRSkKfSkKbmFtZXMoVHdvcHA0ci4zMC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHA0ci4zMCkKIyAycHMKVHdvcHM0ci4xMC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzNHIuMTApLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwczRyLjEwW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKQp9KQpuYW1lcyhUd29wczRyLjEwLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwczRyLjEwKQpUd29wczRyLjMwLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHM0ci4zMCksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBzNHIuMzBbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpCn0pCm5hbWVzKFR3b3BzNHIuMzAuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzNHIuMzApCmBgYAoKYGBge3IgcGxvdC1zb2Mtc3RvY2tzfQojIFBsb3Qgb3B0aW1pemVkIG1vZGVsIFNPQyBzdG9ja3MKbW9kLnNvY3MuZGYuZnggPC0gZnVuY3Rpb24obW9kLCBtb2Quc29jcy5scywgcG9vbHMpIHsKICBuIDwtIHZhcHBseShtb2Quc29jcy5scywgbnJvdywgbnVtZXJpYygxKSkKICByZXR1cm4oZGF0YS5mcmFtZShTT0MgPSBkby5jYWxsKHJiaW5kLCBtb2Quc29jcy5scyksCiAgICAgICAgICAgICAgICAgICAgcG9vbCA9IHJlcChwb29scywgbGVuZ3RoKG1vZC5zb2NzLmxzKSksCiAgICAgICAgICAgICAgICAgICAgUE1lY29fZGVwdGggPSByZXAobmFtZXMobW9kLnNvY3MubHMpLCBuKSwKICAgICAgICAgICAgICAgICAgICBNb2RlbCA9IHJlcChtb2QsIHN1bShuKSkpKSAgICAgICAKfQojIHJ1biBmeAojIG1vZC5zb2NzLjJwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHAiLCBtb2Quc29jcy4ycHAubHMsIGMoImZhc3QiLCAic2xvdyIpKQojICAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBzIiwgbW9kLnNvY3MuMnBzLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcCBbLjUsLjk1XSIsIG1vZC5zb2NzLjJwcC5wMy41Ljk1LmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwczIiLCBtb2Quc29jcy4ycHMyLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcDIiLCBtb2Quc29jcy4ycHAyLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICApCm1vZC5zb2NzLjJwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHAiLCBtb2Quc29jcy4ycHAubHMsIGMoImZhc3QiLCAic2xvdyIpKQogICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcyIsIG1vZC5zb2NzLjJwcy5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICkKCgojIHN0b2NrcyBhbmQgYnVsayAxNEMgb25seQptb2Quc29jcy4ycDQuMTAuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcDQgMC0xMCIsIG1vZC5zb2NzLjJwcDQuMTAubHMsIGMoImZhc3QiLCAic2xvdyIpKSwgbW9kLnNvY3MuZGYuZngoIjJwczQgMC0xMCIsIG1vZC5zb2NzLjJwczQuMTAubHMsIGMoImZhc3QiLCAic2xvdyIpKSkKbW9kLnNvY3MuMnA0LjMwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHA0IDIwLTMwIiwgbW9kLnNvY3MuMnBwNC4zMC5scywgYygiZmFzdCIsICJzbG93IikpICxtb2Quc29jcy5kZi5meCgiMnBzNCAyMC0zMCIsIG1vZC5zb2NzLjJwczQuMzAubHMsIGMoImZhc3QiLCAic2xvdyIpKSkKCiMgc3RvY2tzIGFuZCBidWxrICsgcmVzcCAxNEMKbW9kLnNvY3MuMnA0ci4xMC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwNHIgMC0xMCIsIG1vZC5zb2NzLjJwcDRyLjEwLmxzLCBjKCJmYXN0IiwgInNsb3ciKSksIG1vZC5zb2NzLmRmLmZ4KCIycHM0ciAwLTEwIiwgbW9kLnNvY3MuMnBzNHIuMTAubHMsIGMoImZhc3QiLCAic2xvdyIpKSkKbW9kLnNvY3MuMnA0ci4zMC5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBwNHIgMjAtMzAiLCBtb2Quc29jcy4ycHA0ci4zMC5scywgYygiZmFzdCIsICJzbG93IikpICxtb2Quc29jcy5kZi5meCgiMnBzNHIgMjAtMzAiLCBtb2Quc29jcy4ycHM0ci4zMC5scywgYygiZmFzdCIsICJzbG93IikpKQoKIyBjb21iaW5lIGlucHV0cyB0byBjb21wYXJlCiMgaW4uZml0cy5kZiA8LSBwaXZvdF9sb25nZXIoZG8uY2FsbChiaW5kX3Jvd3MsIGxpc3QoaW4uZml0LjJwcCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5maXQuMnBwLnAzLjUuOTUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uZml0LjJwcDIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uZml0LjJwcywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5maXQuMnBzMikpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJQTWVjb19kZXB0aCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImlucHV0cyIpCiMgaW4uZml0cy5kZiRtb2QgPC0gcmVwKGMoIjJwcCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjJwcC41Ljk1IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMnBwMiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjJwczIiKSwKIyAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDkpCmluLmZpdHMuZGYgPC0gcGl2b3RfbG9uZ2VyKGRvLmNhbGwoYmluZF9yb3dzLCBsaXN0KGluLmZpdC4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmZpdC4ycHMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnl0aGluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJQTWVjb19kZXB0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJpbnB1dHMiKQppbi5maXRzLmRmJG1vZCA8LSByZXAoYygiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgIjJwcyIpLAogICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDkpCiAgICAgICAgICAgICAgICAgICAgICAgIAojIyBwbG90IHN0b2NrcwojIHN0b2NrIGFuZCBidWxrIDE0QyBvbmx5Cm1vZC5zb2NzLjJwNC4xMC5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQptb2Quc29jcy4ycDQuMzAuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyBzdG9jayBhbmQgYnVsayArIHJlc3AgMTRDCm1vZC5zb2NzLjJwNHIuMTAuZGYgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKbW9kLnNvY3MuMnA0ci4zMC5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBpbnB1dHMKaW4uZml0cy5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICAjIE1vZGVsID0gZmFjdG9yKE1vZGVsLCBsZXZlbHMgPSBjKCIycHAgWy41LC45NV0iLCAiMnBwIiwgIjJwcyIpKSwKICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgaW5wdXRzLCBmaWxsID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBwbG90LW9wdC1tb2QtMnBwfQojIHBsb3QgZngKVHdvcC5maXQucGxvdC5meCA8LSBmdW5jdGlvbihmaXQxLCBmaXQxLm5hbWUsIGZpdDIsIGZpdDIubmFtZSwgZml0MyA9IE5VTEwsIGZpdDMubmFtZSA9IE5VTEwpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGZpdDEpLCBmdW5jdGlvbihpKSB7CiAgICBQTWVjbyA8LSBzdWJzdHIobmFtZXMoZml0MSlbaV0sIDEsIDQpCiAgICBseXJfYm90IDwtIHN1YnN0cihuYW1lcyhmaXQxKVtpXSwgCiAgICAgICAgICAgICAgICAgICAgICBuY2hhcihuYW1lcyhmaXQxKVtpXSkgLSAxLCAKICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKG5hbWVzKGZpdDEpW2ldKSkKICAgIGx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQogICAgUE1lY29fZGVwdGggPC0gbmFtZXMoZml0MSlbaV0KICAgIGNvbi5kZiA8LSBjb24uZGYuZngoUE1lY29fZGVwdGgpCiAgICBwbG90LmRmIDwtIHJiaW5kKGZpdDFbW2ldXSwKICAgICAgICAgICAgICAgICAgICAgZml0MltbaV1dLAogICAgICAgICAgICAgICAgICAgICBmaXQzW1tpXV0pCiAgICBwbG90LmRmJE1vZGVsIDwtIGZhY3RvcihjKHJlcChmaXQxLm5hbWUsIG5yb3coZml0MVtbaV1dKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChmaXQyLm5hbWUsIG5yb3coZml0MltbaV1dKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChmaXQzLm5hbWUsIG5yb3coZml0M1tbaV1dKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhmaXQxLm5hbWUsIGZpdDIubmFtZSwgZml0My5uYW1lKSkKICAgIHJldHVybihwbG90LmRmICU+JQogICAgICAgICAgICAgZmlsdGVyKHBvb2wgPT0gImJ1bGsgQyIgfCBwb29sID09ICJyZXNwaXJhdGlvbiIgfCBwb29sID09ICJhdG0iKSAlPiUKICAgICAgICAgICAgIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICAgICAgICAgICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBNb2RlbCkpICsKICAgICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgICAgICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTUwLCAyMDIyKSkgKwogICAgICAgICAgICAgZ2d0aXRsZShwYXN0ZTAoUE1lY29fZGVwdGgsICIgMnAgbW9kIGZpdHMiKSkgKwogICAgICAgICAgICAgeGxhYigiWWVhciIpICsKICAgICAgICAgICAgIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICAgICAgICAgICB0aGVtZV9idygpICsKICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpKQogIH0pCn0KIyAycCBtb2RGaXQgb3B0aW1hbCBtb2RlbCBjb21wYXJpc29uClR3b3AuZml0cy5wbG90cyA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BwLmZpdHMsICIycHAiLCBUd29wcy5maXRzLCAiMnBzIikKVHdvcC5maXRzLnBsb3RzCiMgVHdvcC5maXRzLnBsb3RzMiA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BwLmZpdHMsICIycHAiLCBUd29wcC5wMy41Ljk1LmZpdHMsICIycHAgZ2FtID0gWy41LCAuOTVdIikKIyBUd29wLmZpdHMucGxvdHMyClR3b3AuZml0cy5wbG90czMgPC0gVHdvcC5maXQucGxvdC5meChUd29wcC5wMy41Ljk1LmZpdHMsICIycHAgZ2FtID0gWy41LCAuOTVdIiwgVHdvcHAyLmZpdHMsICIycHAyIikKVHdvcC5maXRzLnBsb3RzMwoKIyMgY29tcGFyZSBmaXRzIHcvIGFuZCB3L28gcmVzcCBjb25zdHJhaW50ICgycDQgbW9kcykKIyAycHAKVHdvcHA0LmZpdHMucGxvdHMuMTAgPC0gVHdvcC5maXQucGxvdC5meChUd29wcDQuMTAuZml0cywgIjJwcDQgMC0xMGNtIHcvbyByZXNwIiwgVHdvcHA0ci4xMC5maXRzLCAiMnBwNHIgMC0xMGNtIHcvIHJlc3AiKQpUd29wcDQuZml0cy5wbG90cy4zMCA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BwNC4zMC5maXRzLCAiMnBwNCAyMC0zMGNtIHcvbyByZXNwIiwgVHdvcHA0ci4xMC5maXRzLCAiMnBwNHIgMjAtMzBjbSB3LyByZXNwIikKIyAycHMKVHdvcHM0LmZpdHMucGxvdHMuMTAgPC0gVHdvcC5maXQucGxvdC5meChUd29wczQuMTAuZml0cywgIjJwczQgMC0xMGNtIHcvbyByZXNwIiwgVHdvcHM0ci4xMC5maXRzLCAiMnBzNHIgMC0xMGNtIHcvIHJlc3AiKQpUd29wczQuZml0cy5wbG90cy4zMCA8LSBUd29wLmZpdC5wbG90LmZ4KFR3b3BzNC4zMC5maXRzLCAiMnBzNCAyMC0zMGNtIHcvbyByZXNwIiwgVHdvcHM0ci4xMC5maXRzLCAiMnBzNHIgMjAtMzBjbSB3LyByZXNwIikKIyBwbG90ClR3b3BwNC5maXRzLnBsb3RzLjEwClR3b3BwNC5maXRzLnBsb3RzLjMwClR3b3BzNC5maXRzLnBsb3RzLjEwClR3b3BzNC5maXRzLnBsb3RzLjMwCmBgYAoKYGBge3IgU0FCLW9ic30KcCA8LSBzcmEudHMuYWxsICU+JQogICAgZmlsdGVyKGQxNGMgPiAtMjAwKSAlPiUKICAgIGZpbHRlcihFQ08gIT0gInJmIikgJT4lCiAgICBmaWx0ZXIobHlyX2JvdCA9PSAyMCkgJT4lCiAgICBmaWx0ZXIoeWVhciAhPSAyMDA5KSAlPiUKICAgIGdncGxvdCguLCBhZXMoeWVhciwgZDE0YykpICsKICAgIGdlb21fcGF0aChkYXRhID0gYXRtLjE0YykgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwbSwgc2hhcGUgPSBlY29UeXBlKSwgc2l6ZSA9IDMuNSkgKwogICAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBsaW5ldHlwZSA9IFR5cGUpLCBzaXplID0gMSwgYWxwaGEgPSAwLjMpICsKICAgIGdlb21fZXJyb3JiYXIoCiAgICAgICAgYWVzKHltaW4gPSBkMTRjX2wsIAogICAgICAgICAgICB5bWF4ID0gZDE0Y191LAogICAgICAgICAgICBjb2xvciA9IHBtKSwgCiAgICAgICAgd2lkdGggPSAuNSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtICh0eXBlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSAoaW5jKSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKGluYykiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIChpbmMpIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybSAoYnVsaykiID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCAoYnVsaykiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoYnVsaykiID0gMTcpKSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogICAgeWxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIHhsYWIoIlllYXIiKSArCiAgICBnZ3RpdGxlKCJCdWxrL2luYyAxMC0yMCBjbSIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkKZ2dzYXZlKCJzcmEudHMucHB3ZjIwLmJsay5pbmMucGRmIiwgcCwgZHBpID0gMzAwLCB3aWR0aCA9IDYuOTcsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIikKIyBpbmMvYnVsayBwcm9maWxlcwpwIDwtIHNyYS4xOS4wMS4wOSAlPiUKICBmaWx0ZXIobHlyX2JvdCA8IDMxKSAlPiUKICBzZWxlY3QoWWVhciwgUE0sIEVDTywgUE1lY28sIGx5cl9ib3QsIGQxNGMsIGQxNGNfc2QpICU+JQogIG11dGF0ZShUeXBlID0gImJ1bGsiLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihZZWFyKSkpICU+JQogIHNlbGVjdCgtZDE0Y19zZCkgJT4lCiAgYmluZF9yb3dzKC4sCiAgICAgICAgICAgIHNyYS4xOS4wMS5pbmMgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHllYXIsIFBNLCBFQ08sIFBNZWNvLCBseXJfYm90LCBkMTRjLCBkMTRjX21pbiwgZDE0Y19tYXgpICU+JQogICAgICAgICAgICAgIHJlbmFtZShkMTRjX2wgPSBkMTRjX21pbiwKICAgICAgICAgICAgICAgICAgICAgZDE0Y191ID0gZDE0Y19tYXgpICU+JQogICAgICAgICAgICAgIG11dGF0ZShUeXBlID0gImluYyIpCiAgKSAlPiUKICBtdXRhdGUoZGVwdGggPSBmYWN0b3IobHlyX2JvdCksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY29UeXBlID0gcGFzdGUwKGVjbywgIiAoIiwgVHlwZSwgIikiKSkKZ2dzYXZlKCJzcmEudHMucHB3ZjIwLmJsay5wZGYiLCBwLCBkcGkgPSAzMDAsIHdpZHRoID0gNi45NywgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iKQpgYGAKCmBgYHtyIFNBQi1tb2RmaXRzfQojIyMgUnVuIG1vZGZpdAojIyAxNEMgYnVsayBvbmx5CiMgMC0xMAptb2Quc2Vucy5maXRzLjJwcy4xMGIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAyLCAuMDAwMSwgLjAwMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4xMGIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjEwYiwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTBiIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCiMgIyAyMC0zMAojIG1vZC5zZW5zLmZpdHMuMnBzLjMwYiA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xNSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDA1LCAuMDAwMSwgLjAwMDQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQojIG5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjMwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCiMgc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYiIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojIG1vZC5maXRzLjJwcy4zMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMTRDIChidWxrICsgcmVzcCkKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzLjEwYnIgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAyLCAuMDAwMSwgLjAwMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjEwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjEwYnIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjEwYnIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyAxMC0yMCwgbGFnID0gNQptb2Quc2Vucy5maXRzLjJwcy4yMGJyLmwgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMjBici5sKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4yMGJyLmwsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjIwYnIubCIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojICMgMjAtMzAKIyBtb2Quc2Vucy5maXRzLjJwcy4zMGJyIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjMwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjE1KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMDUsIC4wMDAxLCAuMDAwNCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIikKIyBuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4zMGJyKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4zMF0KIyBzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjMwYnIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYnIiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBtb2QuZml0cy4ycHMuMzBiciA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMzBiciwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMTRDIGJ1bGsgKyBzdG9ja3MKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzLjEwYnMgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDIGJ1bGsgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4xMGJzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4xMGJzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4xMGJzIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCm1vZC5maXRzLjJwcy4xMGJzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMGJzLCBmdW5jdGlvbih4KSB4W1sxXV0pCiMgIyAyMC0zMAojIG1vZC5zZW5zLmZpdHMuMnBzLjMwYiA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xNSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDA1LCAuMDAwMSwgLjAwMDQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQojIG5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjMwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCiMgc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYiIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojIG1vZC5maXRzLjJwcy4zMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQoKIyMgMTRDICsgY1N0b2NrICgxNEMgcmVzcCwgMTRDIGJ1bGssIHN0b2NrcykKIyAwLTEwCm1vZC5zZW5zLmZpdHMuMnBzLjEwcmJzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzID0gcGFycy5pLjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gaW4uZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyArIGNTdG9jayIpCm5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjEwcmJzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4xMHJicywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHMuMTByYnMiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKbW9kLmZpdHMuMnBzLjEwcmJzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMHJicywgZnVuY3Rpb24oeCkgeFtbMV1dKQojIDEwLTIwCiMgdy9vIGxhZwptb2Quc2Vucy5maXRzLjJwcy4yMHJicyA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGluLmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIC4wMiwgLjk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKC4wMiwgLjAwMDEsIC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAiMTRDICsgY1N0b2NrIikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMuMjByYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjIwXQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4yMHJicyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojIHcvIGxhZyA9IDEyCm1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLmwgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4yMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgLjAyLCAuOTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoLjAyLCAuMDAwMSwgLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdCA9ICIxNEMgKyBjU3RvY2siKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcy4yMHJicy5sKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4yMF0Kc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4yMHJicy5sLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcy4yMHJicy5sIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJkYXRhIikpCiMgIyAyMC0zMAojIG1vZC5zZW5zLmZpdHMuMnBzLjMwYiA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4zMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBpbi5lc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyID0gYygxLCAuMDIsIC4xNSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gYyguMDA1LCAuMDAwMSwgLjAwMDQpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gIjE0QyBidWxrIG9ubHkiKQojIG5hbWVzKG1vZC5zZW5zLmZpdHMuMnBzLjMwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCiMgc2F2ZShtb2Quc2Vucy5maXRzLjJwcy4zMGIsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLmZpdHMuMnBzLjMwYiIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQojIG1vZC5maXRzLjJwcy4zMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjMwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQpgYGAKCmBgYHtyIFNBQi1tb2QtZml0c30KIyBTQUIgZml0cwpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLjEwYl8yMDIxLTA0LTA3LlJkYXRhIikKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcy4xMGJyXzIwMjEtMDQtMDcuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLmZpdHMuMnBzLjEwYnNfMjAyMS0wNC0wNy5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuMTByYnNfMjAyMS0wNC0wNy5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuMjByYnNfMjAyMS0wNC0xMi5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4ycHMuMjByYnMubF8yMDIxLTA0LTEzLlJkYXRhIikKbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcy4yMGJyLmxfMjAyMS0wNC0xMy5SZGF0YSIpCmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBzXzIwMjEtMDQtMDYuUmRhdGEiKQoKIyBleHRyYWN0IG1vZCBmaXRzCm1vZC5maXRzLjJwcy4xMGIgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwYiwgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4ycHMuMTBicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBicywgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4ycHMuMTBiciA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBiciwgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4ycHMuMTByYnMgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjEwcmJzLCBmdW5jdGlvbih4KSB4W1sxXV0pCm1vZC5maXRzLjJwcy4yMHJicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMjByYnMsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuMnBzLjIwcmJzLmwgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwcmJzLmwsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuMnBzLjIwYnIubCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMjBici5sLCBmdW5jdGlvbih4KSB4W1sxXV0pIAogIAojIFNlbnNpdGl2aXR5L0lkZW50aWZpYWJpbGl0eQojIyMjIwojIGV4dHJhY3QgYXQgc2Vuc0Z1biBvdXRwdXQKc2Vucy4ycHMuMTBiIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMGIsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMuMTBiciA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMTBiciwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcy4xMGJzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMGJzLCBmdW5jdGlvbih4KSB4W1syXV0pCnNlbnMuMnBzLjEwcmJzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy4xMHJicywgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcy4yMHJicyA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMjByYnMsIGZ1bmN0aW9uKHgpIHhbWzJdXSkKc2Vucy4ycHMuMjByYnMubCA8LSBsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMuMjByYnMubCwgZnVuY3Rpb24oeCkgeFtbMl1dKQpzZW5zLjJwcy4yMGJyLmwgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLjIwYnIubCwgZnVuY3Rpb24oeCkgeFtbMl1dKQoKIyBwbG90IHNlbnNpdGl2aXR5CmxhcHBseShzZW5zLjJwcy4xMGIsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpsYXBwbHkoc2Vucy4ycHMuMTBiciwgZnVuY3Rpb24oeCkgcGxvdCh4LCB3aGljaCA9IGMoImJ1bGtDIiwgInJlc3AiKSkpCmxhcHBseShzZW5zLjJwcy4xMGJzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKbGFwcGx5KHNlbnMuMnBzLjEwcmJzLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKCiMgbG9vayBhdCBpZGVudGlmaWFiaWxpdHkKaWRlbi4ycHMuMTBiIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjEwYiwgbW9kID0gIjJwcyIpCmlkZW4uMnBzLjEwYnIgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMuMTBiciwgbW9kID0gIjJwcyIpCmlkZW4uMnBzLjEwYnMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMuMTBicywgbW9kID0gIjJwcyIpCmlkZW4uMnBzLjEwcmJzIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjEwcmJzLCBtb2QgPSAiMnBzIikKaWRlbi4ycHMuMjByYnMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMuMjByYnMsIG1vZCA9ICIycHMiKQppZGVuLjJwcy4yMHJicy5sIDwtIGluZGVuLmRmLmZ4KHNlbnMuMnBzLjIwcmJzLmwsIG1vZCA9ICIycHMiKQppZGVuLjJwcy4yMGJyLmwgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMuMjBici5sLCBtb2QgPSAiMnBzIikKCiMgcGxvdApsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzLjEwYnMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzLjEwYnNbW2ldXSwgbW9kID0gIjJwcyIsIAogICAgICAgICAgICAgICBuYW1lcyhpZGVuLjJwcy4xMGJzKVtpXSwgCiAgICAgICAgICAgICAgIG1heChpZGVuLjJwcy4xMGJzW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcy4xMGJyKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcy4xMGJyW1tpXV0sIG1vZCA9ICIycHMiLCAKICAgICAgICAgICAgICAgbmFtZXMoaWRlbi4ycHMuMTBicilbaV0sIAogICAgICAgICAgICAgICBtYXgoaWRlbi4ycHMuMTBicltbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHMuMTByYnMpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzLjEwcmJzW1tpXV0sIG1vZCA9ICIycHMiLCAKICAgICAgICAgICAgICAgbmFtZXMoaWRlbi4ycHMuMTByYnMpW2ldLCAKICAgICAgICAgICAgICAgbWF4KGlkZW4uMnBzLjEwcmJzW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcy4yMHJicyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHMuMjByYnNbW2ldXSwgbW9kID0gIjJwcyIsIAogICAgICAgICAgICAgICBuYW1lcyhpZGVuLjJwcy4yMHJicylbaV0sIAogICAgICAgICAgICAgICBtYXgoaWRlbi4ycHMuMjByYnNbW2ldXVsiY29sbGluZWFyaXR5Il0pKQp9KQpsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzLjIwcmJzLmwpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzLjIwcmJzLmxbW2ldXSwgbW9kID0gIjJwcyIsIAogICAgICAgICAgICAgICBuYW1lcyhpZGVuLjJwcy4yMHJicy5sKVtpXSwgCiAgICAgICAgICAgICAgIG1heChpZGVuLjJwcy4yMHJicy5sW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcy4yMGJyLmwpLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzLjIwYnIubFtbaV1dLCBtb2QgPSAiMnBzIiwgCiAgICAgICAgICAgICAgIG5hbWVzKGlkZW4uMnBzLjIwYnIubClbaV0sIAogICAgICAgICAgICAgICBtYXgoaWRlbi4ycHMuMjBici5sW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKIyMjIyMKCiMgRXh0cmFjdCBvcHRpbWl6ZWQgcGFycyBmcm9tIG1vZGZpdCBvdXRwdXQKIyMjIyMKIyMgYnVsayAxNGMgb25seQojIDAtMTAKcGFycy5maXQuMnBzLjEwYiA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjEwYiwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzLjEwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCiMgIyAyMC0zMAojIHBhcnMuZml0LjJwcy4zMGIgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4zMGIsICJbWyIsIDEpCiMgbmFtZXMocGFycy5maXQuMnBzLjMwYikgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMzBdCgojIyByZXNwICsgYnVsayAxNGMKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGJyIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMTBiciwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzLjEwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojIDEwLTIwIHcvIGxhZyA9IDV5CnBhcnMuZml0LjJwcy4yMGJyLmwgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy4yMGJyLmwsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4yMGJyLmwpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjIwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjMwYnIsICJbWyIsIDEpCiMgbmFtZXMocGFycy5maXQuMnBzLjMwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgYnVsayAxNGMgKyBzdG9ja3MKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGJzIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMTBicywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzLjEwYnMpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjEwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjMwYnIsICJbWyIsIDEpCiMgbmFtZXMocGFycy5maXQuMnBzLjMwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQoKIyMgcmVzcCwgYnVsayAxNGMsIHN0b2NrcwojIDAtMTAKcGFycy5maXQuMnBzLjEwcmJzIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMTByYnMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4xMHJicykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCiMgMTAtMjAKcGFycy5maXQuMnBzLjIwcmJzIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMjByYnMsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjJwcy4yMHJicykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMjBdCiMgMTAtMjAgdy8gbGFnID0gMTJ5CnBhcnMuZml0LjJwcy4yMHJicy5sIDwtIGxhcHBseShtb2QuZml0cy4ycHMuMjByYnMubCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzLjIwcmJzLmwpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjIwXQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiciA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLjMwYnIsICJbWyIsIDEpCiMgbmFtZXMocGFycy5maXQuMnBzLjMwYnIpIDwtIG5hbWVzKHBhcnMuaS4ycHMpW2l4LjMwXQojIyMjIwoKIyBTT0Mgc3RvY2tzCiMjIyMjCiMgdy9vIHN0b2NrIGNvbnN0cmFpbnQKbW9kLnNvY3MuMnBzLjEwYi5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGIpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMuMTBiW1tpXV0sIGluLmVzdFtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMuMTBiLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBiKQptb2Quc29jcy4ycHMuMTBici5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGJyKSwgZnVuY3Rpb24oaSkgewogIHNvYy5meCgiMnBzIiwgcGFycy5maXQuMnBzLjEwYnJbW2ldXSwgaW4uZXN0W1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcy4xMGJyLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBicikKc29jcy4ycHMuMTBici5scyA8LSBtYXBwbHkoY2JpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzb2MuMTkuMF8zMFtpeC4xMF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBzLjEwYnIubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkKIyB3LyBzdG9jayBjb25zdHJhaW50Cm1vZC5zb2NzLjJwcy4xMGJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwYnMpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMuMTBic1tbaV1dLCBpbi5lc3RbW2ldXSkKfSkKbmFtZXMobW9kLnNvY3MuMnBzLjEwYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMGJzKQptb2Quc29jcy4ycHMuMTByYnMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTByYnMpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMuMTByYnNbW2ldXSwgaW4uZXN0W1tpXV0pCn0pCm5hbWVzKG1vZC5zb2NzLjJwcy4xMHJicy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwcmJzKQptb2Quc29jcy4ycHMuMjByYnMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMjByYnMpLCBmdW5jdGlvbihpKSB7CiAgc29jLmZ4KCIycHMiLCBwYXJzLmZpdC4ycHMuMjByYnNbW2ldXSwgaW4uZXN0W2l4LjIwXVtbaV1dKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMuMjByYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4yMHJicykKc29jcy4ycHMuMTByYnMubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KG1vZC5zb2NzLjJwcy4xMHJicy5scywgY29sU3VtcyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQoKIyMgbWFrZSBkZiBmb3IgcGxvdHRpbmcKIyByZXNwICsgYnVsaywgdy8gYW5kIHcvbyBzdG9ja3MKbW9kLnNvY3MuMnBzLjEwYnJyYnMuZGYgPC0gcmJpbmQobW9kLnNvY3MuZGYuZngoIjJwcyB3L28gc3RvY2siLCBtb2Quc29jcy4ycHMuMTBici5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxtb2Quc29jcy5kZi5meCgiMnBzIHcvIHN0b2NrIiwgbW9kLnNvY3MuMnBzLjEwcmJzLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGRhdGEuZnJhbWUoU09DID0gdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCA0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gcGFzdGUwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNzb2MuMTkuMF8zMFtpeC4xMF0sICJbWyIsIDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCAzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCA9ICJtZWFzdXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgPSAidG90YWwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiMgYnVsayArIHN0b2NrLCB2cy4gcmVzcCwgYnVsaywgKyBzdG9jawptb2Quc29jcy4ycHMuMTBic3Jicy5kZiA8LSByYmluZChtb2Quc29jcy5kZi5meCgiMnBzIGJ1bGsgKyBzdG9jayBvbmx5IiwgbW9kLnNvY3MuMnBzLjEwYnMubHMsIGMoImZhc3QiLCAic2xvdyIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbW9kLnNvY3MuZGYuZngoIjJwcyBidWxrLCByZXNwLCArIHN0b2NrIiwgbW9kLnNvY3MuMnBzLjEwcmJzLmxzLCBjKCJmYXN0IiwgInNsb3ciKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGRhdGEuZnJhbWUoU09DID0gdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCA0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gcGFzdGUwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY3NvYy4xOS4wXzMwW2l4LjEwXSwgIltbIiwgMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNzb2MuMTkuMF8zMFtpeC4xMF0sICJbWyIsIDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjc29jLjE5LjBfMzBbaXguMTBdLCAiW1siLCAzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCA9ICJtZWFzdXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgPSAidG90YWwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgoKIyMgcGxvdAptb2Quc29jcy4ycHMuMTBicnJicy5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQptb2Quc29jcy4ycHMuMTBic3Jicy5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgU09DLCBmaWxsID0gTW9kZWwpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhQTSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIyMjIwoKIyMjIFN1bW1hcml6ZSBvcHRpbWl6ZWQgcGFyIGRhdGEgZm9yIHBsb3R0aW5nCiMjIGJ1bGsgMTRjIG9ubHkKIyAwLTEwCnBhcnMuZml0LjJwcy4xMGIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBiLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4zMGIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCiMjIHJlc3AgKyBidWxrIDE0YwojIDAtMTAKcGFycy5maXQuMnBzLjEwYnIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMTBiciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgMTAtMjAKcGFycy5maXQuMnBzLjIwYnIubC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4yMGJyLmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMTBdKQojICMgMjAtMzAKIyBwYXJzLmZpdC4ycHMuMzBici5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjMwYnIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4zMF0pCgojIyBidWxrIDE0YyArIHN0b2NrcwojIDAtMTAKcGFycy5maXQuMnBzLjEwYnMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMTBicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCiMgIyAyMC0zMAojIHBhcnMuZml0LjJwcy4zMGJyLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMzBiciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjMwXSkKCiMjIHJlc3AsIGJ1bGssIHN0b2NrcwojIDAtMTAKcGFycy5maXQuMnBzLjEwcmJzLmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuZml0ID0gcGFycy5maXQuMnBzLjEwcmJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjEwXSkKIyAxMC0yMApwYXJzLmZpdC4ycHMuMjByYnMuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHMuMjByYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMjBdKQojIHcvIGxhZwpwYXJzLmZpdC4ycHMuMjByYnMubC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4yMHJicy5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBzW2l4LjIwXSkKIyAjIDIwLTMwCiMgcGFycy5maXQuMnBzLjMwYnIuZGYgPC0gcGFyLmZpdC5kZi5meChtb2QgPSAiMnBzIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcy4zMGJyLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMuaSA9IHBhcnMuaS4ycHNbaXguMzBdKQoKIyMjIFBhciBmaXRzCnBhci5wbG90LmZ4KG1vZCA9ICIycHMgYnVsayAxNGMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjEwYi5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AgKyBidWxrIDE0YyIsCiAgICAgICAgICAgIGRlcHRoID0gIjAtMTAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMTBici5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIGJ1bGsgMTRjICsgc3RvY2tzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4xMGJzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHMgcmVzcCwgYnVsaywgc3RvY2tzIiwKICAgICAgICAgICAgZGVwdGggPSAiMC0xMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4xMHJicy5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AsIGJ1bGssIHN0b2NrcyIsCiAgICAgICAgICAgIGRlcHRoID0gIjEwLTIwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjIwcmJzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCnBhci5wbG90LmZ4KG1vZCA9ICIycHMgcmVzcCwgYnVsaywgc3RvY2tzIiwKICAgICAgICAgICAgZGVwdGggPSAiMTAtMjAiLAogICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMjByYnMubC5kZiwKICAgICAgICAgICAgaW5pdGlhbCA9IEZBTFNFKQpwYXIucGxvdC5meChtb2QgPSAiMnBzIHJlc3AsIGJ1bGsiLAogICAgICAgICAgICBkZXB0aCA9ICIxMC0yMCIsCiAgICAgICAgICAgIHBhci5kZiA9IHBhcnMuZml0LjJwcy4yMGJyLmwuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKIyBwYXIucGxvdC5meChtb2QgPSAiMnBzIGJ1bGsgMTRjIiwKIyAgICAgICAgICAgICBkZXB0aCA9ICIyMC0zMCIsCiMgICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLjMwYi5kZiwKIyAgICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgcGFyLnBsb3QuZngobW9kID0gIjJwcyByZXNwICsgYnVsayAxNGMiLAojICAgICAgICAgICAgIGRlcHRoID0gIjIwLTMwIiwKIyAgICAgICAgICAgICBwYXIuZGYgPSBwYXJzLmZpdC4ycHMuMzBici5kZiwKIyAgICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCgojIyMgRml0IG1vZGVscyB3aXRoIG9wdGltaXplZCBwYXJzCiMjIGJ1bGsgMTRDIG9ubHkKIyAwLTEwClR3b3BzLjEwYi5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwYiksIGZ1bmN0aW9uKGkpIHsKICB0cnlDYXRjaCgKICAgIHBhci5meChwYXJzLmZpdC4ycHMuMTBiW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKFR3b3BzLjEwYi5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMTBiKQojICMgMjAtMzAKIyBUd29wcy4zMGIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4zMGIpLCBmdW5jdGlvbihpKSB7CiMgICB0cnlDYXRjaCgKIyAgICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4zMGJbW2ldXSwgaW4uZXN0W2l4LjMwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAojICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQojIH0pCiMgbmFtZXMoVHdvcHMuMzBiLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4zMGIpCgojIyByZXNwICsgYnVsayAxNEMKIyAwLTEwClR3b3BzLjEwYnIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGJyKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4xMGJyW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKFR3b3BzLjEwYnIuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwYnIpCiMgMTAtMjAKVHdvcHMuMjBici5sLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMjBici5sKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4yMGJyLmxbW2ldXSwgaW4uZXN0W2l4LjEwXVtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHMiLCBwYXNzID0gRkFMU0UpLAogICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMoVHdvcHMuMjBici5sLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4yMGJyLmwpCiMgIyAyMC0zMAojIFR3b3BzLjMwYnIuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4zMGJyKSwgZnVuY3Rpb24oaSkgewojICAgdHJ5Q2F0Y2goCiMgICAgIHBhci5meChwYXJzLmZpdC4ycHMuMzBicltbaV1dLCBpbi5lc3RbaXguMzBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiMgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCiMgfSkKIyBuYW1lcyhUd29wcy4zMGJyLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4zMGJyKQoKIyMgYnVsayAxNEMgKyBzdG9ja3MKIyAwLTEwClR3b3BzLjEwYnMuZml0cyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcy4xMGJzKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4xMGJzW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKFR3b3BzLjEwYnMuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwYnMpCgojIyByZXNwLCBidWxrLCBzdG9ja3MKIyAwLTEwClR3b3BzLjEwcmJzLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTByYnMpLCBmdW5jdGlvbihpKSB7CiAgdHJ5Q2F0Y2goCiAgICBwYXIuZngocGFycy5maXQuMnBzLjEwcmJzW1tpXV0sIGluLmVzdFtpeC4xMF1bW2ldXSwgdmVyYm9zZSA9IEZBTFNFLCBtb2QgPSAiMnBzIiwgcGFzcyA9IEZBTFNFKSwKICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMHJicykKIyAxMC0yMApUd29wcy4yMHJicy5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjIwcmJzKSwgZnVuY3Rpb24oaSkgewogIHRyeUNhdGNoKAogICAgcGFyLmZ4KHBhcnMuZml0LjJwcy4yMHJic1tbaV1dLCBpbi5lc3RbaXguMjBdW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIsIHBhc3MgPSBGQUxTRSksCiAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhUd29wcy4yMHJicy5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMjByYnMpCgojICMgcmVtb3ZlIG51bGwgZW50cmllcwojIFR3b3BzLjEwYi5maXRzIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIFR3b3BzLjEwYi5maXRzKQojIFR3b3BzLjMwYi5maXRzIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIFR3b3BzLjMwYi5maXRzKQojIFR3b3BzLjEwYnIuZml0cyA8LSBGaWx0ZXIoTmVnYXRlKGlzLm51bGwpLCBUd29wcy4xMGJyLmZpdHMpCiMgVHdvcHMuMzBici5maXRzIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIFR3b3BzLjMwYnIuZml0cykKCiMgTG9vayBhdCByb2xlIG9mIHJlc3AgY29uc3RyYWludCBpbiBmaXQKIyBsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjEwYi5maXRzKSwgZnVuY3Rpb24oaSkgewojICAgQzE0LjJwLnBsb3QuZngoVHdvcHMuMTBiLmZpdHNbW2ldXSwKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4xMGIuZml0cylbaV0pLCAKIyAgICAgICAgICAgICAgICAgIG1vZCA9ICIycHMgYnVsayBvbmx5IiwKIyAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMTBiLmZpdHMpW2ldKQojIH0pCmxhcHBseShzZXFfYWxvbmcoVHdvcHMuMTBici5maXRzKSwgZnVuY3Rpb24oaSkgewogIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwYnIuZml0c1tbaV1dLCAKICAgICAgICAgICAgICAgICBjb24uZGYgPSBjb24uZGYuZngobmFtZXMoVHdvcHMuMTBici5maXRzKVtpXSksIAogICAgICAgICAgICAgICAgIG1vZCA9ICIycHMgYnVsayArIHJlc3AiLAogICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMTBici5maXRzKVtpXSkKfSkKIyBsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjEwYnMuZml0cyksIGZ1bmN0aW9uKGkpIHsKIyAgIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjEwYnMuZml0c1tbaV1dLAojICAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjEwYnMuZml0cylbaV0pLCAKIyAgICAgICAgICAgICAgICAgIG1vZCA9ICIycHMgYnVsayArIHN0b2NrIiwKIyAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMTBicy5maXRzKVtpXSkKIyB9KQpsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjEwcmJzLmZpdHMpLCBmdW5jdGlvbihpKSB7CiAgQzE0LjJwLnBsb3QuZngoVHdvcHMuMTByYnMuZml0c1tbaV1dLCAKICAgICAgICAgICAgICAgICBjb24uZGYgPSBjb24uZGYuZngobmFtZXMoVHdvcHMuMTByYnMuZml0cylbaV0pLCAKICAgICAgICAgICAgICAgICBtb2QgPSAiYnVsaywgcmVzcCwgc3RvY2siLAogICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMTByYnMuZml0cylbaV0pCn0pCiMgMTAtMjAKbGFwcGx5KHNlcV9hbG9uZyhUd29wcy4yMHJicy5maXRzKSwgZnVuY3Rpb24oaSkgewogIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjIwcmJzLmZpdHNbW2ldXSwgCiAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjIwcmJzLmZpdHMpW2ldKSwgCiAgICAgICAgICAgICAgICAgbW9kID0gImJ1bGssIHJlc3AsIHN0b2NrIiwKICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IG5hbWVzKFR3b3BzLjIwcmJzLmZpdHMpW2ldKQp9KQojIGxhcHBseShzZXFfYWxvbmcoVHdvcHMuMzBiLmZpdHMpLCBmdW5jdGlvbihpKSB7CiMgICBDMTQuMnAucGxvdC5meChUd29wcy4zMGIuZml0c1tbaV1dLAojICAgICAgICAgICAgICAgICAgY29uLmRmID0gY29uLmRmLmZ4KG5hbWVzKFR3b3BzLjMwYi5maXRzKVtpXSksIAojICAgICAgICAgICAgICAgICAgbW9kID0gIjJwcyBidWxrIG9ubHkiLAojICAgICAgICAgICAgICAgICAgUE1lY29fZGVwdGggPSBuYW1lcyhUd29wcy4zMGIuZml0cylbaV0pCiMgfSkKIyBsYXBwbHkoc2VxX2Fsb25nKFR3b3BzLjMwYnIuZml0cyksIGZ1bmN0aW9uKGkpIHsKIyAgIEMxNC4ycC5wbG90LmZ4KFR3b3BzLjMwYnIuZml0c1tbaV1dLCAKIyAgICAgICAgICAgICAgICAgIGNvbi5kZiA9IGNvbi5kZi5meChuYW1lcyhUd29wcy4zMGJyLmZpdHMpW2ldKSwgCiMgICAgICAgICAgICAgICAgICBtb2QgPSAiMnBzIGJ1bGsgKyByZXNwIiwKIyAgICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gbmFtZXMoVHdvcHMuMzBici5maXRzKVtpXSkKIyB9KQoKIyMgU2hvdyByb2xlIG9mIHJlc3AgaW4gY29uc3RyYWluaW5nIG1vZGVscwojIEdSd2YgMC0xMApUd29wLmZpdC5wbG90LmZ4KFR3b3BzLjEwYnMuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMGJzLmZpdHMpID09ICJHUndmXzAtMTAiKV0sIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtLCBidWxrIDE0YyArIHN0b2NrIiwgCiAgICAgICAgICAgICAgICAgVHdvcHMuMTByYnMuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMHJicy5maXRzKSA9PSAiR1J3Zl8wLTEwIildLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtLCByZXNwICYgYnVsayAxNGMgKyBzdG9jayIpCiMgQlNyZiAwLTEwClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTBici5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwYnIuZml0cykgPT0gIkJTcmZfMC0xMCIpXSwgCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20gdy8gcmVzcCIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjEwYi5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwYi5maXRzKSA9PSAiQlNyZl8wLTEwIildLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvbyByZXNwIikKVHdvcC5maXQucGxvdC5meChUd29wcy4xMHJicy5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpID09ICJCU3JmXzAtMTAiKV0sCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20gdy8gcmVzcCwgYnVsaywgc3RvY2tzIiwKICAgICAgICAgICAgICAgICBUd29wcy4xMGJzLmZpdHNbd2hpY2gobmFtZXMoVHdvcHMuMTBicy5maXRzKSA9PSAiQlNyZl8wLTEwIildLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvbyByZXNwIChidWxrICsgc3RvY2tzIG9ubHkpIikKVHdvcC5maXQucGxvdC5meChUd29wcy4xMHJicy5maXRzW3doaWNoKG5hbWVzKFR3b3BzLjEwcmJzLmZpdHMpID09ICJCU3dmXzEwLTIwIildLAogICAgICAgICAgICAgICAgICJCYXNhbHQvY29vbCAxMC0yMCIsCiAgICAgICAgICAgICAgICAgVHdvcHMuMTByYnMuZml0c1t3aGljaChuYW1lcyhUd29wcy4xMHJicy5maXRzKSA9PSAiR1J3Zl8xMC0yMCIpXSwKICAgICAgICAgICAgICAgICAiR3Jhbml0ZS9jb29sIDEwLTIwIikKCiMgY29tcGFyZSByZXNwICsgYnVsayBmaXRzIHcvIGFuZCB3L28gc3RvY2tzClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTByYnMuZml0cywgCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20gdy8gcmVzcCwgYnVsaywgc3RvY2tzIiwgCiAgICAgICAgICAgICAgICAgVHdvcHMuMTBici5maXRzLAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtIHcvIHJlc3AgKyBidWxrLCBubyBzdG9jayIpCiMgY29tcGFyZSByZXNwICsgYnVsayBmaXRzIHcvIGFuZCB3L28gc3RvY2tzClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMTBicy5maXRzLCAKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSwgYnVsayAxNGMgKyBzdG9jayIsIAogICAgICAgICAgICAgICAgIFR3b3BzLjEwcmJzLmZpdHMsCiAgICAgICAgICAgICAgICAgIjJwcyAwLTEwY20sIHJlc3AgJiBidWxrIDE0YyArIHN0b2NrIikKIyBjb21wYXJlIEJTd2YgYW5kIEdSd2YgMTAtMjAKQlNHUndmMjAuY29uLmRmIDwtIGNiaW5kKHJiaW5kKGNvbi5kZi5meCgiQlN3Zl8xMC0yMCIpLCBjb24uZGYuZngoIkdSd2ZfMTAtMjAiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbSA9IGZhY3RvcihyZXAoYygiYmFzYWx0IiwgImdyYW5pdGUiKSwgZWFjaCA9IGMoMTEpKSkpCkJTR1J3ZjIwLmNvbi5kZiA8LSBCU0dSd2YyMC5jb24uZGZbLXdoaWNoKEJTR1J3ZjIwLmNvbi5kZiRZZWFyID09IDIwMDkuNSksIF0KQU5HUndmMjAuY29uLmRmIDwtIGNiaW5kKHJiaW5kKGNvbi5kZi5meCgiQlN3Zl8xMC0yMCIpLCBjb24uZGYuZngoIkdSd2ZfMTAtMjAiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbSA9IGZhY3RvcihyZXAoYygiYmFzYWx0IiwgImdyYW5pdGUiKSwgZWFjaCA9IGMoMTEpKSkpCkJTR1J3ZjIwLmNvbi5kZiA8LSBCU0dSd2YyMC5jb24uZGZbLXdoaWNoKEJTR1J3ZjIwLmNvbi5kZiRZZWFyID09IDIwMDkuNSksIF0KYXRtLjE0YzIgPC0gVHdvcHMuMjByYnMuZml0cyRgQlN3Zl8xMC0yMGBbVHdvcHMuMjByYnMuZml0cyRgQlN3Zl8xMC0yMGAkeWVhcnMgPj0gMTk1MCAmIFR3b3BzLjIwcmJzLmZpdHMkYEJTd2ZfMTAtMjBgJHBvb2wgPT0gImF0bSIsIF0KIyBwbG90CnAgPC0gcmJpbmQoVHdvcHMuMjByYnMuZml0cyRgQlN3Zl8xMC0yMGAsCiAgICAgIFR3b3BzLjIwcmJzLmZpdHMkYEdSd2ZfMTAtMjBgKSAlPiUKICBtdXRhdGUocG0gPSByZXAoYygiYmFzYWx0IiwgImdyYW5pdGUiKSwgCiAgICAgICAgICAgICAgICAgIGVhY2ggPSBucm93KFR3b3BzLjIwcmJzLmZpdHMkYEJTd2ZfMTAtMjBgKSkpICU+JQogIGZpbHRlcihwb29sID09ICJidWxrIEMiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChkYXRhID0gYXRtLjE0YzIpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gcG9vbCwgY29sb3IgPSBwbSkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBCU0dSd2YyMC5jb24uZGYsIAogICAgICAgICAgICAgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG0sIHNoYXBlID0gcG9vbCksIAogICAgICAgICAgICAgc2l6ZSA9IDIuNSwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgIHZhbHVlcyA9IGMoImJhc2FsdCIgPSAicmVkIiwKICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoCiAgICBuYW1lID0gIiIsCiAgICB2YWx1ZXMgPSBjKCJidWxrIEMiID0gMTYsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAxKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgKICAgbmFtZSA9ICJQb29sIiwKICAgdmFsdWVzID0gYygiYnVsayBDIiA9IDEsCiAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9IDIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKZ2dzYXZlKCJzcmEuMnBzLkJTR1J3ZjIwLnBkZiIsIHAsIGRwaSA9IDMwMCwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIpCiMgY29tcGFyZSByZXNwICsgYnVsayBmaXRzIHcvIGFuZCB3L28gc3RvY2tzClR3b3AuZml0LnBsb3QuZngoVHdvcHMuMjBici5sLmZpdHMsIAogICAgICAgICAgICAgICAgICIycHMgMC0xMGNtLCBidWxrIDE0YyArIHN0b2NrIiwgCiAgICAgICAgICAgICAgICAgVHdvcHMuMjByYnMuZml0cywKICAgICAgICAgICAgICAgICAiMnBzIDAtMTBjbSwgcmVzcCAmIGJ1bGsgMTRjICsgc3RvY2siKQojIyMjIwoKIyBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzCiMjIyMjCiMgMnBzClNBLjJwcy4yMC5yYnMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMjByYnMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzLjIwcmJzW1tpXV1bMToyXQogIHRjIDwtIHBhcnMuZml0LjJwcy4yMHJic1tbaV1dWzNdCiAgSW4gPC0gaW4uZXN0W2l4LjIwXVtbaV1dCiAgQSA8LSBkaWFnKC1rcykKICBBWzIsIDFdIDwtIHRjICoga3NbMV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSBBLCB1ID0gYyhJbiwgMCkpKQp9KQpuYW1lcyhTQS4ycHMuMjAucmJzLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHMuMjByYnMpCmxhcHBseShTQS4ycHMuMjAucmJzLmxzLCAiW1siLCAxKQoKIyMgVHJhbnNpdCB0aW1lCiMgMnBzClRULjJwcy4yMC5yYnMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMjByYnMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzLjIwcmJzW1tpXV1bMToyXQogIHRjIDwtIHBhcnMuZml0LjJwcy4yMHJic1tbaV1dWzNdCiAgSW4gPC0gaW4uZXN0W2l4LjIwXVtbaV1dCiAgQSA8LSBkaWFnKC1rcykKICBBWzIsIDFdIDwtIHRjICoga3NbMV0KICByZXR1cm4odHJhbnNpdFRpbWUoQSA9IEEsIHUgPSBjKEluLCAwKSkpCn0pCm5hbWVzKFRULjJwcy4yMC5yYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4yMHJicykKbGFwcGx5KFRULjJwcy4yMC5yYnMubHMsICJbWyIsIDEpCiMgMC0xMApUVC5NQS4ycHMuMTAucmJzLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzLjEwcmJzKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcy4xMHJic1tbaV1dWzE6Ml0KICB0YyA8LSBwYXJzLmZpdC4ycHMuMTByYnNbW2ldXVszXQogIEluIDwtIGluLmVzdFtpeC4xMF1bW2ldXQogIEEgPC0gZGlhZygta3MpCiAgQVsyLCAxXSA8LSB0YyAqIGtzWzFdCiAgVFQgPC0gdHJhbnNpdFRpbWUoQSA9IEEsIHUgPSBjKEluLCAwKSkKICBBZ2UgPC0gc3lzdGVtQWdlKEEgPSBBLCB1ID0gYyhJbiwgMCkpCiAgcmV0dXJuKGxpc3QoVFQgPSBUVCRtZWFuVHJhbnNpdFRpbWUsIEFnZSA9IEFnZSRtZWFuU3lzdGVtQWdlKSkKfSkKbmFtZXMoVFQuTUEuMnBzLjEwLnJicy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzLjEwcmJzKQpsYXBwbHkoVFQuTUEuMnBzLjEwLnJicy5scywgdW5saXN0KQojIAphZ2VELjJwcy4xMC5yYnMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMuMTByYnMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzLjEwcmJzW1tpXV1bMToyXQogIHRjIDwtIHBhcnMuZml0LjJwcy4xMHJic1tbaV1dWzNdCiAgSW4gPC0gaW4uZXN0W2l4LjEwXVtbaV1dCiAgQSA8LSBkaWFnKC1rcykKICBBWzIsIDFdIDwtIHRjICoga3NbMV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSBBLCB1ID0gYyhJbiwgMCkpKQp9KQpuYW1lcyhhZ2VELjJwcy4xMC5yYnMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcy4xMHJicykKYGBgCgpgYGB7ciBtb2RGaXQtMnAtY29tcGFyaXNvbn0KIyBjb21wYXJlIG91dHB1dCBvZiAycHAgYW5kIDJwcyBtb2RlbCBmaXRzCm1lcmdlKHNzci4ycHAuZGYsIHNzci4ycHMuZGYsIGJ5ID0gIlBNZWNvX2RlcHRoIiwgc3VmZml4ZXMgPSBjKCJfMnBwIiwgIl8ycHMiKSkgJT4lCiAgbXV0YXRlKHNzcl8ycHAgPSByb3VuZChzc3JfMnBwLCAxKSwKICAgICAgICAgc3NyXzJwcyA9IHJvdW5kKHNzcl8ycHMsIDEpLAogICAgICAgICBkaWYgPSBzc3JfMnBwIC0gc3NyXzJwcykKbWVyZ2UodmFyX21zLjJwcC5kZiwKICAgICAgdmFyX21zLjJwcy5kZiwKICAgICAgYnkgPSBjKCJQTWVjb19kZXB0aCIsICJ2YXIiKSwKICAgICAgc3VmZml4ZXMgPSBjKCJfMnBwIiwgIl8ycHMiKSkgJT4lCiAgbXV0YXRlKHZhcl9tc18ycHAgPSByb3VuZCh2YXJfbXNfMnBwLCA0KSwKICAgICAgICAgdmFyX21zXzJwcyA9IHJvdW5kKHZhcl9tc18ycHMsIDQpLAogICAgICAgICBkaWYgPSB2YXJfbXNfMnBwIC0gdmFyX21zXzJwcykKCiMjIFBsb3QKIyBTU1IsIFBNCnJiaW5kKHNzci4ycHAuZGYsIHNzci4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyhzc3IuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkoUE0sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4uc3NyID0gbWVhbihzc3IpLCBzZCA9IHNkKHNzcikpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4uc3NyICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnNzciAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnNzciwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgICB3aWR0aCA9IC4zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IFBNKSArCiAgZ2d0aXRsZSgiU1NSIDItcG9vbCBtb2RlbHMgMC0xMCBjbSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIFNTUiwgZWNvCnJiaW5kKHNzci4ycHAuZGYsIHNzci4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyhzc3IuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkoZWNvLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnNzciA9IG1lYW4oc3NyKSwgc2QgPSBzZChzc3IpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnNzciArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi5zc3IgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi5zc3IsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAgIHdpZHRoID0gLjMpICsKICBmYWNldF93cmFwKC4gfiBlY28pICsKICBnZ3RpdGxlKCJTU1IgMi1wb29sIG1vZGVscyAwLTEwIGNtIChlY28pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHZhcl9tcywgUE0KcmJpbmQodmFyX21zLjJwcC5kZiwgdmFyX21zLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhY2ggPSBucm93KHZhcl9tcy4ycHAuZGYpKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBncm91cF9ieSh2YXIsIFBNLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnZhcl9tcyA9IG1lYW4odmFyX21zKSwgc2QgPSBzZCh2YXJfbXMpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnZhcl9tcyArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi52YXJfbXMgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi52YXJfbXMsIGZpbGwgPSBQTSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiB2YXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIlJlc2lkdWFsIGVycm9yIDItcG9vbCBtb2RlbHMgMC0xMCBjbSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIHZhcl9tcywgZWNvCnJiaW5kKHZhcl9tcy4ycHAuZGYsIHZhcl9tcy4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyh2YXJfbXMuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkodmFyLCBlY28sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4udmFyX21zID0gbWVhbih2YXJfbXMpLCBzZCA9IHNkKHZhcl9tcykpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4udmFyX21zICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnZhcl9tcyAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnZhcl9tcywgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIGZhY2V0X3dyYXAoLiB+IHZhciwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgiUmVzaWR1YWwgZXJyb3IgMi1wb29sIG1vZGVscyAwLTEwIGNtIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgYWdlcy10dC1tb2RGaXR9CiMjIFN5c3RlbSBhZ2UKIyAycHAKU0EuMnBwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcFtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwW1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBwW1tpXV0KICByZXR1cm4oc3lzdGVtQWdlKCwgdSA9IEluKSkKfSkKbmFtZXMoU0EuMnBwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpTQS4ycHAucDMuNS45NS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoU0EuMnBwLnAzLjUuOTUubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQojIDJwcwpTQS4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHNbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHNbW2ldXQogIHJldHVybihzeXN0ZW1BZ2UoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhTQS4ycHMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKCiMjIFRyYW5zaXQgdGltZQojIDJwcApUVC4ycHAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBwW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHBbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHBbW2ldXQogIHJldHVybih0cmFuc2l0VGltZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFRULjJwcC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KVFQuMnBwLnAzLjUuOTUubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHAucDMuNS45NVtbaV1dCiAgcmV0dXJuKHRyYW5zaXRUaW1lKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoVFQuMnBwLnAzLjUuOTUubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQojIDJwcwpUVC4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHNbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHNbW2ldXQogIHJldHVybih0cmFuc2l0VGltZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFRULjJwcy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzKQpgYGAKCmBgYHtyIFNBLVRULWNvbXB9CiMgY29tcGFyZSBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzIGFtb25nIHRoZSB0d28gbW9kZWwgc3RydWN0dXJlcwpTQS4ycC5scyA8LSBsaXN0KFNBLjJwcC5scywgU0EuMnBzLmxzLCBTQS4ycHAucDMuNS45NS5scykKU0EuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShTQS4ycC5scywgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICAgIGRhdGEuZnJhbWUoYWdlID0gYyhsc1tbaV1dW1sibWVhblN5c3RlbUFnZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxzW1tpXV1bWyJtZWFuUG9vbEFnZSJdXSksCiAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gYygic3lzdGVtIiwgImZhc3QgcG9vbCIsICJzbG93IHBvb2wiKSkKICAgIH0pCiAgfSkKKQpTQS5kZiRQTWVjb19kZXB0aCA8LSByZXAobmFtZXMoU0EuMnBwLmxzKSwgZWFjaCA9IDMsIHRpbWVzID0gbGVuZ3RoKFNBLjJwLmxzKSkKU0EuZGYkTW9kZWwgPC0gcmVwKGMoIjJwcCIsICIycHMiLCAiMnBwIFsuNSwgLjk1XSIpLCBlYWNoID0gMjcpClRULjJwLmxzIDwtIGxpc3QoVFQuMnBwLmxzLCBUVC4ycHMubHMsIFRULjJwcC5wMy41Ljk1LmxzKQpUVC5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KFRULjJwLmxzLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KHNlcV9hbG9uZyhscyksIGZ1bmN0aW9uKGkpIHsKICAgICBkYXRhLmZyYW1lKGFnZSA9IGxzW1tpXV1bWyJtZWFuVHJhbnNpdFRpbWUiXV0sCiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSAidHJhbnNpdCIpCiAgICB9KQogIH0pCikKVFQuZGYkUE1lY29fZGVwdGggPC0gcmVwKG5hbWVzKFRULjJwcC5scyksIHRpbWVzID0gbGVuZ3RoKFRULjJwLmxzKSkKVFQuZGYkTW9kZWwgPC0gcmVwKGMoIjJwcCIsICIycHMiLCAiMnBwIFsuNSwgLjk1XSIpLCBlYWNoID0gOSkKU0EuVFQuZGYgPC0gcmJpbmQoU0EuZGYsIFRULmRmKQpTQS5UVC5kZiRQTSA8LSBzdWJzdHIoU0EuVFQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpClNBLlRULmRmJGVjbyA8LSBzdWJzdHIoU0EuVFQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMywgc3RvcCA9IDQpCgojIyBQbG90IGFnZXMgYW5kIHRyYW5zaXQgdGltZXMKIyBieSBQTQpTQS5UVC5kZiAlPiUKICBzZWxlY3QoIWMoUE1lY29fZGVwdGgsIGVjbykpICU+JQogIGdyb3VwX2J5KGNvbXBvbmVudCwgUE0sIE1vZGVsKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbl9hZ2UgPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbl9hZ2UgKyBzZCwKICAgICAgICAgZXJyX2wgPSBtZWFuX2FnZSAtIHNkKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKE1vZGVsLCBtZWFuX2FnZSwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogICMgZ2VvbV9lcnJvcmJhcigKICAjICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgIyAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgIyAgIHdpZHRoID0gLjMpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gY29tcG9uZW50LCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKCJtZWFuIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIGJ5IGVjbwpTQS5UVC5kZiAlPiUKICBzZWxlY3QoIWMoUE1lY29fZGVwdGgsIFBNKSkgJT4lCiAgZ3JvdXBfYnkoY29tcG9uZW50LCBlY28sIE1vZGVsKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbl9hZ2UgPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbl9hZ2UgKyBzZCwKICAgICAgICAgZXJyX2wgPSBtZWFuX2FnZSAtIHNkKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKE1vZGVsLCBtZWFuX2FnZSwgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAjIGdlb21fZXJyb3JiYXIoCiAgIyAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksCiAgIyAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgIyAgIHdpZHRoID0gLjMpICsKICBmYWNldF93cmFwKC4gfiBjb21wb25lbnQsIHNjYWxlcyA9ICJmcmVlIikgKwogIHlsYWIoIm1lYW4gYWdlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIEJheWVzaWFuIHBhcmFtZXRlciBlc3RpbWF0aW9uIChNQ01DKQoKYGBge3IgTUNNQy1maXRzLCBldmFsID0gRkFMU0V9CiMgdGhlIGZvbGxvd2luZyAuUkRhdGEgZmlsZXMgYXJlIGdlbmVyYXRlZCBieSBzY3JpcHQgInNyYS10cy9zb3VyY2Uvc3JhLXRzLTE0Yy1tY21jLWJheWVzLlIiCmxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTA2L2JheWVzX2ZpdF8ycHBfMC0xMF81MDAwaXRlci5SRGF0YSIpCmxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTE3L2JheWVzX2ZpdF8ycHNfMC0xMF81MDAwaXRlci5SRGF0YSIpCgojICMgcGxvdCBwYXJhbWV0ZXIgY29udmVyZ2VuY2UKIyBsYXBwbHkoYmF5ZXNfZml0XzJwcF8wXzEwLCBwbG90KQojIGxhcHBseShiYXllc19maXRfMnBzXzBfMTAsIHBsb3QpCgojIHBsb3QgY29sbGluZWFyaXR5Cml0ZXIgPC0gNTAwMApsYXBwbHkoYmF5ZXNfZml0XzJwcF8wXzEwLCBwYWlycywgbnNhbXBsZSA9IGZsb29yKGl0ZXIvNCkpCmxhcHBseShiYXllc19maXRfMnBzXzBfMTAsIHBhaXJzLCBuc2FtcGxlID0gZmxvb3IoaXRlci80KSkKCiMjIGxvb2sgYXQgbW9kZWwgcGVyZm9ybWFuY2UKcGFycy5iYXllcy5kZi5meCA8LSBmdW5jdGlvbihtb2QsIHBhcnMuYmF5ZXMsIHBhcnMuZml0KSB7CiAgYmluZF9yb3dzKGxhcHBseShzZXFfYWxvbmcocGFycy5iYXllcyksIGZ1bmN0aW9uKGkpIHsKICAgIGl4IDwtIG1hdGNoKHVuaXF1ZShwYXJzLmJheWVzW1tpXV1bWyJwYXJzIl1dWywgMV0pLCBwYXJzLmJheWVzW1tpXV1bWyJwYXJzIl1dWywgMV0pCiAgICBkZiA8LSBkYXRhLmZyYW1lKGsxID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgMV0sCiAgICAgICAgICAgICAgICAgICAgIGsyID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgMl0sCiAgICAgICAgICAgICAgICAgICAgIHAzID0gcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVtpeCwgM10pCiAgICBkZiA8LSBjYmluZChkZiwKICAgICAgICAgICAgICAgIFBNZWNvX2RlcHRoID0gcmVwKG5hbWVzKHBhcnMuZml0KVtpXSwgbGVuZ3RoKGl4KSksCiAgICAgICAgICAgICAgICBtb2QgPSByZXAobW9kLCBsZW5ndGgoaXgpKSkKICAgIGRmIDwtIGNiaW5kKGRmLCAKICAgICAgICAgICAgICAgIFBNID0gZmFjdG9yKHN1YnN0cihkZiRQTWVjb19kZXB0aCwgMSwgMikpLAogICAgICAgICAgICAgICAgZWNvID0gZmFjdG9yKHN1YnN0cihkZiRQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKQogICAgcmV0dXJuKGRmKQogIH0pKQp9CnBhcnMuYmF5ZXMuMnBwLmRmIDwtIHBhcnMuYmF5ZXMuZGYuZngoIjJwcCIsIGJheWVzX2ZpdF8ycHBfMF8xMCwgcGFycy5maXQuMnBwKQpwYXJzLmJheWVzLjJwcy5kZiA8LSBwYXJzLmJheWVzLmRmLmZ4KCIycHMiLCBiYXllc19maXRfMnBzXzBfMTAsIHBhcnMuZml0LjJwcykKCiMgIyBsaW5lYXIgZml0cwojIHN1bW1hcnkobG0oazIgfiBQTSwgcGFycy5iYXllcy4ycHAuZGYpKQojIHN1bW1hcnkobG0oazIgfiBlY28sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKIyBzdW1tYXJ5KGxtKGsxIH4gUE0sIHBhcnMuYmF5ZXMuMnBwLmRmKSkKIyBzdW1tYXJ5KGxtKGsxIH4gZWNvLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShwMyB+IFBNLCBwYXJzLmJheWVzLjJwcC5kZikpCiMgc3VtbWFyeShsbShwMyB+IGVjbywgcGFycy5iYXllcy4ycHAuZGYpKQoKIyBiZXN0IHBhciBzZXQKYmVzdFBhcnMuYmF5ZXMubHMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHBfMF8xMCwgZnVuY3Rpb24oeCkgewogIHJvdW5kKGRhdGEuZnJhbWUoazEgPSB4JGJlc3RwYXJbMV0sCiAgICAgICAgICAgICAgICAgICBrMiA9IHgkYmVzdHBhclsyXSwKICAgICAgICAgICAgICAgICAgIGdhbSA9IHgkYmVzdHBhclszXSksCiAgICAgICAgNCkKfSkKYmVzdFBhcnMuYmF5ZXMuZGYgPC0gY2JpbmQoUE0gPSByZXAoYygiQU4iLCAiQlMiLCAiR1IiKSwgZWFjaCA9IDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlY28gPSByZXAoYygicHAiLCAicmYiLCAid2YiKSwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gcmVwKCIwLTEwIiwgOSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRfcm93cyhiZXN0UGFycy5iYXllcy5scykpCgojIHN1bW1hcml6ZSBieSBQTQpwYXJzLmJheWVzLlBNIDwtIGJlc3RQYXJzLmJheWVzLmRmICU+JQogIHNlbGVjdCghYyhlY28sIGRlcHRoKSkgJT4lCiAgZ3JvdXBfYnkoUE0pICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpICU+JQogIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDMpCiMgc3VtbWFyaXplIGJ5IEVDTwpwYXJzLmJheWVzLmVjbyA8LSBiZXN0UGFycy5iYXllcy5kZiAlPiUKICBzZWxlY3QoIWMoUE0sIGRlcHRoKSkgJT4lCiAgZ3JvdXBfYnkoZWNvKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAzKQoKIyBwbG90IGJlc3QgcGFycwpiZXN0UGFycy5iYXllcy5kZiAlPiUKICBwaXZvdF9sb25nZXIoIShQTTpkZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGNvbG9yID0gUE0sIHNoYXBlID0gZWNvKSkgKwogIGdlb21faml0dGVyKHNpemUgPSA0KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3QgYWNjZXB0ZWQgcGFycyBieSBQTSBhbmQgdGhlbiBieSBlY28KcGFycy5iYXllcy5kZiAlPiUKICBwaXZvdF9sb25nZXIoIWMoUE0sIGVjbywgUE1lY29fZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiBwYXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCnBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCFjKFBNLCBlY28sIFBNZWNvX2RlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgZmlsbCA9IGVjbykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGA=